0

私は休止状態を使用しており、空のデータベースにデータを入力するコードを書いています。私が文、句、文字を固執しているふりをしましょう。レターはフレーズとセンテンスの両方で発生するため、それぞれ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 は更新クエリを発行します。

更新: 私はばかです。フレーズと文字の関係は多対多であり、重要な制約に違反していたため、実際には例外が発生していました。

4

1 に答える 1

1

どのように関係を築いていますか。あなたの場合に適切と思われる以下のコードは問題なく動作します。

    LetterEntity letter = new LetterEntity();
    PhraseEntity phrase = new PhraseEntity();
    SentenceEntity sentence = new SentenceEntity();

    sentence.getLetters().add(letter);
    s.persist(sentence);
    phrase.getLetters().add(letter);
    s.persist(phrase);
于 2012-04-03T22:10:24.117 に答える