Hibernate之mappedBy
摘要: 一。mappedBy單向關系不需要設置該屬性,雙向關系必須設置,避免雙方都建立外鍵字段 數據庫中1對多的關系,關聯關系總是被多方維護的即外鍵建在多方,我們在單方對象的@OneToMany(ma.........
一。mappedBy 單向關系不需要設置該屬性,雙向關系必須設置,避免雙方都建立外鍵字段
數據庫中1對多的關系,關聯關系總是被多方維護的即外鍵建在多方,我們在單方對象的@OneToMany(mappedby=" ")
把關系的維護交給多方對象的屬性去維護關系
對於mappedBy復習下:
a) 只有OneToOne,OneToMany,ManyToMany上才有mappedBy屬性,ManyToOne不存在該屬性;
b) mappedBy標簽一定是定義在the owned side(被擁有方的),他指向theowning side(擁有方);
c) 關系的擁有方負責關系的維護,在擁有方建立外鍵。所以用到@JoinColumn
d)mappedBy跟JoinColumn/JoinTable總是處於互斥的一方
二。下面是我自己的理解,一直對hibernate中的維護關聯關系不太了解,總不知道他們具體指的是什么
這里的維護關聯關系,拿多對多來說就是中間表,在不設置cascade的情況下,中間表由負責維護關聯關系的一方維護
舉例說明:
Game 和User 兩個實體類,他們是多對多的關系,有中間表t_game-user.
在User中配置有:
@ManyToMany(mappedBy="users")
public List<Game> getGames() {
return games;
}
Game中配置有:
@ManyToMany
@JoinTable(name = "t_game_user",
joinColumns = {@JoinColumn(name = "game_id",referencedColumnName="gameId")},
inverseJoinColumns = {@JoinColumn(name = "user_id",referencedColumnName="id")})
public List<User> getUsers() {
return users;
}
所以說由Game來維護他們的關聯關系,即中間表
表現形式:
1.因為沒有配置cascade所以分別給Game,User添加4條數據,然后手動在中間表中添加他們的關聯關系
2.在程序中執行刪除User,
Hibernate: delete from t_user where id=?
Hibernate: delete from t_user where id=?
Hibernate: delete from t_user where id=?
Hibernate: delete from t_user where id=?
刪除了User,並沒有對中間表發生影響
3.在程序中執行刪除Game
Hibernate:delete from t_game_user where game_id=?
Hibernate:delete from t_game_user where game_id=?
Hibernate:delete from t_game_user where game_id=?
Hibernate:delete from t_game_user where game_id=?
Hibernate:delete from t_game where game_id=?
Hibernate:delete from t_game where game_id=?
Hibernate:delete from t_game where game_id=?
Hibernate:delete from t_game where game_id=?
對中間表產生了影響,說明是Game在維護他們之間的關聯關系
三。下面這里是一對多的維護關聯關系,(同樣是在部設置cascade的前提下)一對多的關聯關系其實更簡單,因為他們之間沒有中間表,User和Group,他們的關聯關系就是體現在one方(group)的主鍵是Many方(User)的外鍵,這個關聯關系就在User的表中。因為有外鍵的存在,group在user刪除之前,是不能夠刪除的,所以他們之間維護關聯關系的任務就只能交給Many方(User)
