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了 Letter 以将其添加到句子集合中。但是,当我也将 Letter 添加到短语 usingsetLetters时,Hibernate 会尝试再次保留该 Letter,但出现异常。如何在没有 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 回答