Hibernate之mappedBy與@JoinColumn


@JoinColumn所在實體是關系擁有方,name即擁有方對應表到參考表的外鍵名稱。

@mappedBy所在實體是關系的被擁有方,value值owner中表示被擁有類的屬性。

在單向關系中不需要設置mappedBy屬性,雙向關系中必須設置,避免雙方都建立外鍵字段。 

數據庫中一對多的關系,關聯關系總是被多方維護的,即外鍵建在多方,我們在單方對象上使用注解@OneToMany(mappedby=" "),把關系的維護交給多方對象的屬性去完成。

  a) 只有OneToOne,OneToMany,ManyToMany上才有mappedBy屬性,ManyToOne不存在該屬性;

  b) mappedBy標簽一定是定義在the owned side(被擁有方的),它指向theowning side(擁有方);

  c) 關系的擁有方負責關系的維護,在擁有方建立外鍵,所以用到@JoinColumn

  d)mappedBy跟JoinColumn/JoinTable總是處於互斥的一方。

多對多

  這里的維護關聯關系,拿多對多來說就是中間表,在不設置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添加一條數據,然后手動在中間表中添加它們的關聯關系

  2.在程序中執行刪除User

  Hibernate: delete from t_user where id=?

  刪除了User,並沒有對中間表發生影響

  3.在程序中執行刪除Game

  Hibernate:delete from t_game_user where game_id=?

  Hibernate:delete from t_game where game_id=?

  對中間表產生了影響,說明是Game在維護它們之間的關聯關系

一對多

  (同樣是在不設置cascade的前提下)一對多的關聯關系其實更簡單,因為它們之間沒有中間表,User和Group它們的關聯關系就是體現在One方(Group)的主鍵是Many方(User)的外鍵,這個關聯關系就在User的表中。因為有外鍵的存在,Group在User刪除之前,是不能夠刪除的,所以它們之間維護關聯關系的任務就只能交給Many方(User)。

 


免責聲明!

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



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