`
什么世道
  • 浏览: 219307 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Hibernate 关系映射之多对一,一对多关联

阅读更多

Hibernate 关系映射之多对一,一对多关联

一、多对一单向

使用场景:以用户(user)和组(group)关系为例 。

    一个组有多个用户;每一个用户对应一个特定的组。

 

  • 对象模型


 

实体类 User

public class User {
  private int id;
  private String name;
  private Group group;
  public Group getGroup() {return group;  }
  public void setGroup(Group group) {this.group = group;}
  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;}} 

 实体类Group

public class Group {
  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方式

<many-to-one>标签设定关联,在多的一方设置对应的外键

 

 

<!--Group.hbm.xml-->
<hibernate-mapping>
  <class name="com.yk.hibernate.Group" table="group">
      <id name="id" column="id">
          <generator class="native"/>
      </id>
      <property name="name"/>
  </class>
</hibernate-mapping>
<!--User.hbm.xml-->
<hibernate-mapping>
  <class name="com.yk.hibernate.User" table="user">
      <id name="id" column="id">
          <generator class="native"/>
      </id>
      <property name="name"/>  
      <many-to-one name="group" column="gid"/>
  </class>
</hibernate-mapping>

 

 

 annotation方式

在“多”的类中的“一”对象getter方法上添加注解@ManyToOne注解,并用@JoinColumn设定外键名,如下

 

 

@ManyToOne
@JoinColumn(name="gid")
  public Group getGroup() {
      return group;
 }

 

 

二、一对多单向

使用场景:以Class(班级)和Student(学生)的关系为例。

每一个学生属于一个班,每一个班有多个学生。

 

  • 对象模型 

 

实体类Class:

 

public class Class{
  private int id;
  private String name; 
  private Set<Student>students = new HashSet<Student>();
  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;}
}

  实体类Student:

 

 

public class Student {
  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>标签 映射一对多(映射set集合),name=集合对象,然后在用<key>标签定义外键。<one-to-many>标签设置映射的类实体

 

<!--Student.hbm.xml-->
<hibernate-mapping>
    <class name="com.yk.hibernate.Student" table="student">
        <id name="id" column="id">
            <generator class="native"/>
        </id>
        <property name="name" column="name"/>
    </class>
</hibernate-mapping> 
<!--Class.hbm.xml-->
<hibernate-mapping>
    <class name="com.yk.hibernate.Classes" table="class">
        <id name="id" column="id">
            <generator class="native"/>
        </id>
        <property name="name" column="name"/>       
        <set name="students">
            <key column="cid"/>
            <one-to-many class="com.yk.hibernate.Student"/>
        </set>
    </class>
</hibernate-mapping>

 

2.annotation方式 

在“一”的类中的“多”对象getter方法上添加注解@OneToMany 注解,并用@JoinColumn设定外键名,如下

 @OneToMany 
 @JoinColumn(name="cid") 
   public Set<Student>getStudents() {
     return students;
 }

 

三、多对一双向(一对多双向)

在此不再累赘了,"一"和"多"关系可以双向维持,使用不是很多。关联设定的方法是上面两者的综合。

 

 

  • 大小: 8.3 KB
  • 大小: 10.1 KB
  • 大小: 10.4 KB
  • 大小: 10.3 KB
1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics