天天看點

Hibernate 關系映射之多對多關聯Hibernate 關系映射之多對多關聯

Hibernate 關系映射之多對多關聯

現實中的對象之前的關系大多是多對多的關系,因為一對一,多對一,一對多的關系都可以歸結到多對多關系的一種特殊情況。

多對多關系實作的方式:

建立一張中間表,2個字段外鍵關聯對應2張表的id,用2個多對一的關系實作多對多關聯。

一、多對多單向關聯

    場景:以使用者(User)和角色(Role)關系為例 。

    一個使用者對應多種角色,一種角色對應多個使用者。

  • 對象關聯 
Hibernate 關系映射之多對多關聯Hibernate 關系映射之多對多關聯

實體類User

public class User {
    private int id;
    private String name;   
    private Set<Role> roles;
    public int getId() {return id;}
    public void setId(int id) {this.id = id;}
    public String getName() {return name;}
    public void setName(Stringname) {this.name = name;}
    public Set<Role> getRoles() {return roles;}
    public void setRoles(Set<Role> roles) {this.roles = roles;}
}
           

實體類Role

public class Role {
    private int id;
    private String name;
    public int getId() return id;}
    public void setId(int id) {this.id = id;}
    public String getName() {return name;}
    public void setName(Stringname) {  this.name = name;}
}
           
  • 關系模型
Hibernate 關系映射之多對多關聯Hibernate 關系映射之多對多關聯
  • 關聯映射

1.xml方式

在 一方添加<set>标簽 映射多對多(映射set集合),name=集合對象,然後在用<key>标簽定義外鍵。<many-to-many>标簽設定映射的類實體

<!--Role.hbm.xml-->
<class name="com.yk.hibernate.Role" table="role">
      <id name="id">
          <generator class="native"/>
      </id>
      <property name="name" column="name"/>
</class>
<!--User.hbm.xml-->   
</span><class name="com.yk.hibernate.User" table="user">  
        <id name="id">  
            <generator class="native"/>  
        </id>  
        <property name="name" column="name"/>   
        <set name="users" table="user_role"order-by="userId"></span>  
            <key column="role_id"/>  
            <many-to-many class="com.yk.hibernate.User" column="user_id"/>  
        </set>    
</class>        

 2.annotation方式 

在一方類 的“多(set<E>)”對象getter方法上添加注解@ManyToMany 注解,并使用@JoinTabel來注解第三方表的名稱,再使用joinColumns屬性來指定目前對象User在中間表中的字段名, 再用inverseJoinColumns來指定目前類持有引用的實體對象Role在中間表的字段名,并且指向被引用對象相對應的表,如下:

@ManyToMany  
@JoinTable(name="user_role",  
          joinColumns={@JoinColumn(name="user_id")},   
          inverseJoinColumns={@JoinColumn(name="role_id")}   
 )  
public Set<User> getRoles() {return roles;}
           

二、多對多雙向關聯

場景:以上述場景為例

  • 對象模型:同上
  • 關系模型:同上
  • 關聯映射

1.xml方式:

在單向關聯的基礎上,在另一個映射檔案建立同樣的many-to-many标簽

<!--User.hbm.xml--> 
<class name="com.yk.hibernate.User" table="user">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name" column="name"/> 
        <set name="users" table="user_role"order-by="userId">
            <key column="role_id"/>
            <many-to-many class="com.yk.hibernate.User" column="user_id"/>
        </set>  
</class>        

2.annotation方式 

多對多關聯映射 雙向 兩方都持有對象引用,修改對象模型,但資料的存儲沒有變化

隻需要修改注解映射就可以了。

在單向關聯的基礎上,另一個類的Set<E>對象上加上注釋mappedBy

User.java

@ManyToMany
@JoinTable(name="user_role", 
          joinColumns={@JoinColumn(name="user_id")}, 
          inverseJoinColumns={@JoinColumn(name="role_id")} 
  )
  public Set<User> getRoles() {return roles;}
           

Role.java

@ManyToMany(mappedBy="roles")
  public Set<User>getUsers() {return users;}
           

繼續閱讀