Hibernate 关系映射之多对一,一对多关联
程序员文章站
2022-04-19 11:09:22
...
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; }
三、多对一双向(一对多双向)
在此不再累赘了,"一"和"多"关系可以双向维持,使用不是很多。关联设定的方法是上面两者的综合。
上一篇: Java闭包原型已经公布
下一篇: 尬事连篇,笑声不断