2009-03-21 13 views
15

JPAには2つのエンティティEntry and Commentがあります。エントリには、2つのコメントオブジェクトのコレクションが含まれています。JPAで同じタイプのコレクションを2つ持つにはどうすればいいですか?

@Entity 
public class Entry { 
    ... 

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @IndexColumn(base = 1, name = "dnr") 
    private List<Comment> descriptionComments = new ArrayList<Comment>(); 

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @IndexColumn(base = 1, name = "pmnr") 
    private List<Comment> postMortemComments = new ArrayList<Comment>(); 

    ... 
} 

ようなオブジェクトを格納するために、JPA + Hibernateは、 "入力" テーブルを作成し、テーブルと単一の "Entry_Comment" を "コメント":オブジェクトの

create table Entry_Comment (Entry_id integer not null, postMortemComments_id integer not null, pmnr integer not null, descriptionComments_id integer not null, dnr integer not null, primary key (Entry_id, dnr), unique (descriptionComments_id), unique (postMortemComments_id))

保管はdescriptionComments_idpostMortemComments_idとして失敗することはできません同時に "not null"を返します。

JPA + Hibernateを使用して同じタイプの2つのコレクションを含むオブジェクトを保存するにはどうすればよいですか?

答えて

13

これは多くのHibernateバグ(正確にはHHH-3410)の1つです。

@JoinTableの注釈を@OneToManyのリレーションシップに追加することで修正できました。各リレーションには独自のテーブル名があります。

あなたのケースでは、それは次のようになります。

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
@JoinTable(name="entity_descriptioncomments") 
@IndexColumn(base = 1, name = "dnr") 
private List<Comment> descriptionComments = new ArrayList<Comment>(); 

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
@JoinTable(name="entity_postmortemcomments") 
@IndexColumn(base = 1, name = "pmnr") 
private List<Comment> postMortemComments = new ArrayList<Comment>(); 

を:あなたにも@IndexColumn注釈を追加する必要があります(理由は、複数のEAGERバッグを持つ他のHibernateの問題で:HHH-1718/EJB-346)。

+0

そして、どうやってこの関係を双方向にするのですか? –

4

JPAの2つのコレクションをDataNucleushttp://www.datanucleus.org)で保存するには、これまでと同じようにします。 @JoinTableアノテーションがないため、各コレクションのFKはCommentに配置する必要があります。あなたが実際に@JoinTableをどこか(またはXMLに相当する)持っていれば、それぞれの結合テーブルの名前を(各コレクションに1つずつ)設定することもできます(したがって、独自の結合テーブルがあります)。 DataNucleusでも2つのコレクションの間で共有結合テーブルを使用できますが、これはベンダー拡張ではなく標準のJPAではありません。

それが仕様;-)

2

を持つことのポイントは、データモデルから現在のマッピングで問題が存在し、私はさっぱりだが、しかし、これはJPAがそうザッツ以来、一貫していなければならないで休止状態にマッピングする方法/ビューのドメインモデルのポイント:あなたはactaully エントリコメント単一@OneToMany関係を有しています。 「説明」または「死後」:とコメントエンティティが1つの以上の属性がタイプ2つの値をとる呼ばれている必要があります。 エントリのあなたの現在の実装あなたが2つの異なるエンティティ(おそらくJPAの継承機能を使用)にコメントエンティティを破壊し、エントリ@JoinTable注釈を使用して検討する必要がありますエンティティにインライン的には

0

2つのインデックス列定義が同じ名前になるように設定するのはどうですか?

+0

試しました。 Hibernateはまだ例外をスローします。 –

関連する問題