1

以下のエンティティがあるとしましょう

@Entity
public class Item{

    private Country origin;

    @ManyToOne(optional=true)
    @JoinColumn(name="origin")
    public Country getOrigin() {
        return this.origin;
    }

}

@Entity
public class Country{

    private String code;
    private String desc;

    @Id
    public String getCode() {
        return this.code;
    }

    @Column
    public String getDesc() {
        return this.desc;
    }

}

ここで、Countryクラスは事前設定されたマスター テーブルにマップされ、変更しないでください。ユーザーは、新しい を作成するときにoriginを設定できます。提供されたものがすでにマスターテーブルのエントリであるかどうかを確認するにはどうすればよいですか?codeItemcode

子を永続化せずに存在しないだけpersist()で新しい場合は、報告されます。この例外を try-catch して、存在しないマスター データとして扱う必要がありますか? または、より良い代替手段はありますか?Itemcodeorg.hibernate.TransientObjectException

実際には、オブジェクト内にこれらの子エンティティが多数存在するItemため、マスター データを 1 つずつ明示的に参照するのは得策ではないと思います。そして、これも良い解決策ではないと思います。

4

1 に答える 1

1

どのソリューションでも、マスター テーブルを参照して、Country既に存在するかどうかを確認する必要があります。この呼び出しを明示的に行うか、フレームワーク (Hibernate) にこれを行うように依頼するかが問題です。

作成しているソース/入力が信頼できないことがCountryわかっている場合は、明示的にテーブルに対してデータを検証します。Item厳密に制御できる GUI を使用している場合、存在する有効なオプションのみをユーザーに提供する必要があるため、おそらくこのエラーは発生しません。また、信頼できないデータのために永続化する前にチェックする必要があることがわかっている場合は、明示的にすることで、この明示的なチェックを含めるように単体テストを作成できます。

Hibernate はクエリを Country テーブルにキャッシュするので、アプリケーションのパフォーマンスに影響を与えることはないと思います。

于 2012-08-13T11:04:24.150 に答える