天天看点

org.hibernate.TransientObjectException

使用JPA注解@ManyToMany做一个多对多的用例。

为了避免在删除主表数据时同时级联删除从表数据,​​JPA官方文档​​建议在主表的从表字段使用级联注解:CascadeType.PERSIST,CascadeType.MERGE,进行配置。

主表代码:

从表代码:

Dao层代码:

main代码:

运行main方法,第18行报如下异常,这应该是一个Hibernate实现JPA接口的一个bug。

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: b12_ManyToMany_JoinTable.Hobby

策略一,使用CascadeType.ALL注解,可以保存,但在删除操作时,产生ERROR: ORA-02292: 违反完整约束条件 (WXUATUSER.FK_ODDM1C9RTQFPO2HI2BCR4OUQX) - 已找到子记录。不可取。

策略二,改用persist方法保存,报异常:detached entity passed to persist。不可取。

策略三,使用Hibernate的注解@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE}),增删改查,达到预期的级联效果,删除主表数据不会级联到从表。可取。

继续阅读