Hibernate:在持久集合中重用持久化类

时间:2012-04-03 20:29:14

标签: java hibernate

我正在使用hibernate并且正在编写代码来填充空数据库。让我们假装我坚持句子,短语和字母。由于字母和句子都有字母,我将让每个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会再次尝试保留该字母并获得异常。如何在没有休眠的情况下将字母添加到短语中并尝试再次保留它?

更新:我发现阅读有关双射协会非常有帮助。

http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/#collections-bidirectional

虽然不是我的问题的一部分,但我设置了许多双射关联。我发现它们之所以必要,是因为它使批量插入更快。当您向集合添加元素时,Hibernate会发出更新查询。

更新:我是个白痴。短语和字母之间的关系是多对多的,我实际上是因为我违反了一个关键约束而得到例外。

1 个答案:

答案 0 :(得分: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);