【问题标题】:Hibernate: How to solve circleHibernate:如何解决循环问题
【发布时间】:2021-03-12 04:32:45
【问题描述】:

我正在解决以下问题,我想实施一个干净的解决方案。

想象一下这个实体图:

一本书有页面,用户可以为每本书添加注释。对于每个注释,用户可以指定注释引用的多个页面。

当我创建一个新结构并尝试保存它时,我得到以下异常:

TransientPropertyValueException: Not-null property references a transient value - transient instance must be saved before current operation : NoteToBokPage.page -> page",

所以 Hibernate 告诉我先保存页面,然后才能保存 NoteToBookPage。这意味着我不能级联所有项目的保存。 将所有实体设置为 CASCADE.ALL 而不是 NoteToBookPage 然后手动保存 NoteToBookPage 是否是最好的方法?这是个好方法吗?

我的问题是,我的结构实际上更大。书不是根。上面有两层,我的计划是通过触发根元素的更新并级联所有内容,为整个树提供一种更新方法。当使用级联保存所有内容时,它似乎很丑陋,而不是一片叶子,然后手动进行。 是否有可能告诉 Hibernate 在保存 NoteToBookPage 之前必须先在页面上进行保存?我希望当我将 PageList-Attriubte 放在 NoteList-Attribute 上方的 Book-Class 中时它可以工作,但它没有。

任何想法如何处理这个性感的方式?

谢谢

【问题讨论】:

  • 我不确定我是否可以遵循,但添加您的实际代码(或重现问题的简化示例)会有所帮助。从理论上讲,JPA 非常简单:您可以使用单个实体,因此应该管理在其他地方使用的所有实体,或者如果您想一次保存整个图形,则使用级联。

标签: hibernate one-to-many hibernate-mapping hibernate-onetomany


【解决方案1】:

我终于找到了问题。

当我创建一个虚拟实体结构并尝试保存它时出现了问题。我犯了一个错误,另一个实体引用的实体不是同一个 Java 实例。我创建了一个具有相同值的新实例,但是因为我使用标准的 java 对象 equals/hascode hibernate 没有将其识别为 equals。

当我创建我的虚拟结构时,我必须确保所有引用的实体实际上都是同一个 java 对象实例。然后hibernate能够一次持久化整个结构。

【讨论】:

    猜你喜欢
    • 2019-07-09
    • 2017-06-24
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 2019-02-23
    相关资源
    最近更新 更多