使用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}),增删改查,達到預期的級聯效果,删除主表資料不會級聯到從表。可取。