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