2016-09-14 10 views
0

2つのエンティティクラスがあります。限界値

@Entity 
public class Person { 
    @ManyToOne(cascade = CascadeType.PERSIST) 
    private Hobby hobby; 
} 


@Entity 
public class Hobby { 
    private String hobby; 
} 

Person.hobbyフィールドが「趣味」テーブルに発見された値のみを取る必要があります。だから私はHobbiesのセットを定義したいと思っています。それでPersonはちょうど1つを選ぶことができます。もちろん、1つの趣味を多くの人が共有でき、の新しいPersonが追加されたときには「趣味」テーブルを変更しないでください。

実際、これはJavaでコード化されていないが、基になるデータベースの「趣味」テーブルで定義されている列挙を実現します。新しい趣味を追加する必要がある場合、コードベースではなくデータベースのみを変更する必要があります。

これは、hibernate(4.3)アノテーションとJPAアノテーションでどのように実現されますか?

答えて

0

あなたはすでにそれを行いました!

@ManyToOneを実行すると、Person.hobby列がHobby.idの外部キーになります。

趣味でもIDを追加する必要がありますが、すでにそれがあると思います。

Personクラスで使用する前にEntityManagerから趣味のエンティティをロードし、既存の趣味を再利用する場合は新しいHobby()オブジェクトを作成しないでください。

Hobby hobby = entityManager.findByName(hobbyName) 
person.setHobby(hobby) 

偶然新しい趣味を導入しないようにするには、hobbyNameに一意の制約を追加することができます。

代わりに、hobbyNameをHobbyクラスの実際の主キーにすることもできます。しかし、その後、あなたは、これはSQLクエリを回避するなどの取引理論的には

Hobby hobby = new Hobby(hobbyName) 
hobby = entityManager.merge(hobby) 
person.setHobby(hobby) 

で処理する方法を知っている休止状態のオブジェクトを作成するために、マージコールを必要としています。しかし、これは悪い習慣であると考えられています。merging a detached or new entity with an existing entity in hibernate/jpa best practice question

+0

ありがとう、@greyfairer。 idフィールドを省略してコードを削除しました。外部キーの関係は、実際にそこにあります。 「趣味」テーブルの内容を読み込むことは意味があります。私はそうではありません、そして、それは何度も同じ趣味でテーブルを満たしています。 しかし、休止状態がそれを処理するなら、それはいいでしょう。私はこのようなものを探しています:多分 'Hobby.hobby.hobby'を主キー(すなわち@Id)にして、Hobby.hobbyと同じ値を持つ趣味が挿入されていれば、自動的にこの参照を取るようにしてください。それは良い習慣と考えられているのですか?これは私を実際のEnumに近づけるでしょう。 –

+0

コード例を追加し、hobbyNameを主キーとして使用する例を追加しました。 – greyfairer

+0

今は完全に意味があります。再度、感謝します! –