Hibernate ManyToOne, OneToMany的理解


 

User to Group, Many to One的關系

 

Test Case 1:

session.beginTransaction();
user.setGroup(group);
session.save(group);
session.save(user);
session.getTransaction().commit();

先保存group, 在保存user,沒問題兩條SQL INSERT語句發出來,數據庫有數據,

Hibernate: insert into t_group (name) values (?)
Hibernate: insert into t_user (userId, userName) values (?, ?)

 

Test Case 2:

session.beginTransaction();
user.setGroup(group);
session.save(user);
session.getTransaction().commit();

先不保存group, 直接保存user,會有INSERT語句發出來,和TransientObjectException拋出。

原因是沒有先保存關聯的One那一端

Hibernate: insert into t_user (userId, userName) values (?, ?)

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.fm.entity.Group

結論,在ManytoOne中,必須先保存One的一端,因為沒有One的一端,Many一端沒地方依賴。

如果想能夠單獨保存,多的一端User,可以在ManyToOne前面加上optional=true,如下:

@ManyToOne(optional=true)
@JoinColumn(name="userId")
private Group group;

Group to User , One to Many的關系

在one to many的情況,下可以不先保存 group mapping的 user,直接保存group,沒有問題。

session.beginTransaction();
session.save(group);
session.getTransaction().commit();

Hibernate: insert into t_group (name) values (?)

 

如果想保存一端的時候,順帶把另外一端也保存掉,使用如下注解:

@ManyToOne(cascade={CascadeType.ALL})


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM