@JoinColumn
Hibernate的@OneToMany和@ManyToOne都可以用@JoinColumn。@JoinColumn有name屬性需要設置成爲多的一方的外鍵,當@OneToMany用@JoinColumn時,表示一的一方控制關聯關係,並且@OneToMany設置了cascade=CascadeType.ALL,這時刪除一端時不會拋出異常,多端外鍵被設置爲null。
主控制方在一端,
也就是在一端set多端的時候,數據庫會爲你保存級聯關係(在多端指向一端的外鍵設置值了)。
SClass c=new SClass();
c.getStudents().add(s);
c.getStudents().add(s1);
session.save(c);mappedBy
Hibernate的@OneToMany可以用mappedBy。@ManyToOne沒有該屬性,mappedBy有name屬性需要設置成爲“多”方class類裏的“一”方的變量名,當@OneToMany用mappedBy時表示多方控制關聯關係。
如果保存設置一端的屬性保存時,多端中一端的外鍵會設置爲null。
Java代碼
//多方:
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name=”cid”)
public Classroom getClassroom() {
return classroom;
}
public void setClassroom(Classroom classroom) {
this.classroom = classroom;
}
Java代碼
//一方
@OneToMany(mappedBy=”classroom”)
public Set getUsers() {
return users;
}
public void setUsers(Set users) {
this.users = users;
}
這樣只有一條插入語句:
Hibernate: insert into Classroom (cname) values (?)
爲了更好地說明問題,我把以上一方的配置進行修改
加入了 cascade=CascadeType.ALL
同樣執行以上代碼 顯示插入了兩條:
Hibernate: insert into Classroom (cname) values (?)
Hibernate: insert into User (cid, uname, upass) values (?, ?, ?)
但是查看數據庫就會發現:
雖然插入了..但是外鍵卻沒有值
一方不維護關係就可以明顯的看出來.
但是一方的其他不影響關係的更新操作是沒有問題的:
Java代碼 收藏代碼
Classroom cr=(Classroom)session.get(Classroom.class, 1);
System.out.println(cr.getUsers().iterator().next().getUname());
cr.getUsers().iterator().next().setUname(“XX”);
執行以上的代碼:
顯示:
Hibernate: select classroom0_.cid as cid1_0_, classroom0_.cname as cname1_0_ from Classroom classroom0_ where classroom0_.cid=?
Hibernate: select users0_.cid as cid1_1_, users0_.uid as uid1_, users0_.uid as uid0_0_, users0_.cid as cid0_0_, users0_.uname as uname0_0_, users0_.upass as upass0_0_ from User users0_ where users0_.cid=?Hibernate: update User set cid=?, uname=?, upass=? where uid=?數據在數據庫裏也被正常更新
@JoinColumn和mappedBy都不用時會生成一箇中間表。
Hibernate中@OneToMany與ManyToOne的mappedBy和@JoinColumn區別
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.