Hibernate oneToMany - 对象引用一个未保存的瞬态实例

Posted

技术标签:

【中文标题】Hibernate oneToMany - 对象引用一个未保存的瞬态实例【英文标题】:Hibernate oneToMany - object references an unsaved transient instance 【发布时间】:2022-01-02 17:48:05 【问题描述】:

我有一张具有 oneToMany 关系的表:

<hibernate-mapping>
    <class name="com.al6.jtob.data.Lsell" table="LSELL" >
    ...
       <many-to-one name="stock" class="com.al6.jtob.data.Stock" insert="false" update="false">
          <column name="IDITEM" />
          <column name="IDWAREHOUSE" />
       </many-to-one>
    ...
    </class>
</hibernate-mapping>

StockID 由 (IDITEM, IDWAREHOUSE) 组成。

当我加载现有的 LSELL 对象时,它运行良好。 但是当我创建一个新的 LSELL 对象时,我有这个错误:

Caused by: javax.ejb.EJBException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.al6.jtob.data.Stock

我不想更新或保存任何新的“库存”到数据库中,它只是一个只读数据。所有的库存数据都是完整和充足的。 目标只是在我显示“Lsell”时获得“Lsell”的“库存”。

【问题讨论】:

请添加您持久化 Lsell 实体的方式。 【参考方案1】:

您忘记在关系映射中声明CascadeType。您必须将cascade=all 放在映射标记中,因为CascadeType 将实体转换从父级传播到子级。例如,如果您持久化父实体,则引用的实体也会在刷新之前持久化。

<one-to-many name="lsell" class="com.al6.jtob.data.Lsell" cascade="all">
   ...
</one-to-many>

【讨论】:

我明白,但如果创建“Lsell”,则关联的“库存”已经在数据库表中。股票一天初始化一次,我不想在这个表中删除或添加任何东西。我只想在加载 Lsell 时将“Lsell”与股票信息链接起来。在这种情况下我必须使用“分离”而不是“全部”吗? 你的父实体是什么? Lsell 是父实体。 cascade="all" 放入您的父实体而不是子实体。你能告诉我你的父实体吗? 因为子实体被引用到父实体

以上是关于Hibernate oneToMany - 对象引用一个未保存的瞬态实例的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate如何正确删除@OneToMany中的孩子?

无法使用嵌入式对象发布 JSON - 它读取并存储除对象列表 (OneToMany) 之外的所有内容 - Spring Boot API (+ hibernate)

Hibernate @OneToMany 关联尝试设置空 FK 值

JPA 2 / Hibernate 孤儿删除仍然无法与@OneToMany 一起使用?

码农小汪-Hibernate学习8-hibernate关联关系注解表示@OneToMany mappedBy @ManyToMany @JoinTable

项目记事Hibernate-1:调用 saveOrUpdate() 方法出错