Hibernate 关系映射之多对多关联

Hibernate 关系映射之多对多关联

现实中的对象之前的关系大多是多对多的关系,因为一对一,多对一,一对多的关系都可以归结到多对多关系的一种特殊情况。

多对多关系实现的方式:

新建一张中间表,2个字段外键关联对应2张表的id,用2个多对一的关系实现多对多关联。

 

一、多对多单向关联

   

    场景:以用户(User)和角色(Role)关系为例 。

    一个用户对应多种角色,一种角色对应多个用户。

  • 对象关联 


 

 

实体类User

 

public class User {
    private int id;
    private String name;   
    private Set 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 getRoles() {return roles;}
    public void setRoles(Set 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;}
}

 

  • 关系模型



 

 

 

  • 关联映射

1.xml方式

 

在 一方添加标签 映射多对多(映射set集合),name=集合对象,然后在用标签定义外键。标签设置映射的类实体

 



      
          
      
      

   
  
          
              
          
           
          
              
              
            
  

 

 2.annotation方式 

在一方类 的“多(set)”对象getter方法上添加注解@ManyToMany 注解,并使用@JoinTabel来注解第三方表的名称,再使用joinColumns属性来指定当前对象User在中间表中的字段名, 再用inverseJoinColumns来指定当前类持有引用的实体对象Role在中间表的字段名,并且指向被引用对象相对应的表,如下:

  

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

 

 

二、多对多双向关联

 

场景:以上述场景为例

  • 对象模型:同上
  • 关系模型:同上
  • 关联映射

1.xml方式:

在单向关联的基础上,在另一个映射文件建立同样的many-to-many标签

 

 

        
            
        
         
        userId">
            
            
          
  

 

 

2.annotation方式 

多对多关联映射 双向 两方都持有对象引用,修改对象模型,但数据的存储没有变化

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

在单向关联的基础上,另一个类的Set对象上加上注释mappedBy

User.java

 

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

 

 

Role.java

 

  @ManyToMany(mappedBy="roles")
  public SetgetUsers() {return users;}

 

 

 

 

你可能感兴趣的:(网页框架,Hibernate,O/RMaping,关联映射,多对多)