java - Hibernate:在持久集合中重用持久类

标签 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;
}

当我填充数据库时,我只需设置 Letter 的 setSentenceId 即可将其添加到句子集合中。但是,当我还使用 setLetters 将字母添加到短语中时,Hibernate 会再次尝试保留该字母,但出现异常。如何将字母添加到短语中而不需要 Hibernate 尝试再次保留它?

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

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

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

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

最佳答案

你是如何建立你们的关系的。下面的代码似乎适合您的情况,工作正常。

    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);

关于java - Hibernate:在持久集合中重用持久类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10000896/

相关文章:

java - 未知实体类型异常 : Unable to locate persister (Hibernate 5. 0)

hibernate 批量插入

java - Google App Engine (GAE) Java 服务器如何检查它是否是后端?

java - 使用 AJAX、JAVA WS-RS @Post 发送 Xml

java.nio.file 无法复制文件

mysql - JBoss 7.1.1 中的 java.lang.ClassNotFoundException : com. mysql.jdbc.Driver - 出了什么问题?

java - 如果应用程序关闭,每 15 分钟 Android 通知就会崩溃一次

java - Spigot-Bungeecord 插件消息传递不起作用

java - 如何设置 intellij-idea 以理解 hibernate XML 文件中的表名

java - JPA:保留/更新子项期间的事件通知?