私は休止状態を使用しており、空のデータベースにデータを入力するコードを書いています。私が文、句、文字を固執しているふりをしましょう。レターはフレーズとセンテンスの両方で発生するため、それぞれLetterEntity
にその参照を持たせSentenceEntity
、それぞれSentenceEntity
にレターのコレクションを持たせます。
@OneToMany(cascade={CascadeType.PERSIST, CascadeType.MERGE}, fetch=FetchType.LAZY)
@JoinColumn(name="sentenceid")
@Sort(type=SortType.NATURAL)
public SortedSet<LetterEntity> getLetters() {
return this.letters;
}
今のところ問題ありません。またPhraseEntity
、文字とフレーズのサブコレクションが重複する可能性があるため、文字は複数のフレーズに含まれる可能性があります。このために、リレーションシップ用の追加のテーブルが必要になります。
@OneToMany(fetch = FetchType.LAZY)
@JoinTable(name = "phrase_letters", joinColumns = @JoinColumn(name = "phraseid"), inverseJoinColumns = @JoinColumn(name = "letterid"))
@Sort(type=SortType.NATURAL)
public SortedSet<TypeEntity> getLetters() {
return this.letters;
}
データベースに入力するときsetSentenceId
は、レターの を設定して文のコレクションに追加するだけです。ただし、を使用してフレーズにレターも追加するsetLetters
と、Hibernate はレターを再度永続化しようとし、例外が発生します。Hibernate が再度保持しようとせずに、レターをフレーズに追加するにはどうすればよいですか?
更新: 全単射連想について読むのはとても役に立ちました。
http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/#collections-bidirectional
私の質問の一部ではありませんが、私は多くの全単射の関連付けを設定しました。一括挿入がはるかに高速になるため、一部は必要だと思います。コレクションに要素を追加すると、Hibernate は更新クエリを発行します。
更新: 私はばかです。フレーズと文字の関係は多対多であり、重要な制約に違反していたため、実際には例外が発生していました。