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})