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;
}
三、多对一双向(一对多双向)
在此不再累赘了,"一"和"多"关系可以双向维持,使用不是很多。关联设定的方法是上面两者的综合。