Hibernate是一种优秀的ORM框架,它能够有效地使Java应用程序与数据库交互。在Hibernate中,实体之间的关系是通过映射关系来维护的,在映射关系中,一对一、一对多和多对一是最为常见的关系类型。本文将详细讲解Hibernate的一对一、一对多/多对一关联保存的实现全过程。
一对一关系保存实现
首先我们需要定义两个实体类,分别代表两个具有一对一关系的表,这里我们以学校表和校长表为例进行说明。我们先定义学校表实体类School和校长表实体类Headmaster,校长表中包含了学校表的外键school_id。
@Entity
@Table(name = "t_school")
public class School implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// 省略Getter和Setter方法
}
@Entity
@Table(name = "t_headmaster")
public class Headmaster implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "school_id")
private School school;
// 省略Getter和Setter方法
}
其中,校长表的school
属性使用了@OneToOne
注解来表示它与学校表的关系。需要注意的是,在校长表实体类中,我们使用了@JoinColumn
注解来指定学校表的外键,这将在数据库中创建t_headmaster表的时候添加一个school_id的外键列,并将其与t_school表的id关联。
接着我们需要在Hibernate的会话中创建对象并保存,示例代码如下:
Session session = sessionFactory.openSession();
Transaction t = session.beginTransaction();
// 创建学校对象
School school = new School();
school.setName("中央大学");
// 创建校长对象
Headmaster headmaster = new Headmaster();
headmaster.setName("Jack");
// 将校长与学校关联
headmaster.setSchool(school);
// 保存学校和校长
session.save(school);
session.save(headmaster);
t.commit();
session.close();
这里我们首先实例化了学校对象和校长对象,然后将二者关联起来,最后调用session的save()方法来完成保存操作。
一对多/多对一关系保存实现
当实体类中存在一对多/多对一关系时,需要在多端(即多对一的那个实体类)中使用@ManyToOne
注解和@JoinColumn
注解来指定多端与一端的关系。下面我们以学生表和班级表为例,来展示一对多关系的保存实现过程。
@Entity
@Table(name = "t_class")
public class Class implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "class_id")
private List<Student> students = new ArrayList<>();
// 省略Getter和Setter方法
}
@Entity
@Table(name = "t_student")
public class Student implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "class_id")
private Class clazz;
// 省略Getter和Setter方法
}
与一对一关系一样,我们也需要在多端的实体类中定义one-to-many
的映射关系,这里我们使用了@OneToMany
注解。@OneToMany
注解需要使用@JoinColumn
注解来指定多端与一端的关系,这里我们用@JoinColumn
来标识这个关联关系的外键列名为class_id。
接着我们需要在Hibernate的会话中创建对象并保存,示例代码如下:
Session session = sessionFactory.openSession();
Transaction t = session.beginTransaction();
// 创建班级对象
Class clazz = new Class();
clazz.setName("Java班");
// 创建学生对象
Student student1 = new Student();
student1.setName("小明");
student1.setClazz(clazz);
Student student2 = new Student();
student2.setName("小红");
student2.setClazz(clazz);
// 维护关系
clazz.getStudents().add(student1);
clazz.getStudents().add(student2);
// 保存班级和学生
session.save(clazz);
session.save(student1);
session.save(student2);
t.commit();
session.close();
在这里,我们创建了一个班级对象,以及属于该班级的两个学生对象。然后我们将这两个学生对象插入班级对象的students列表中,最后统一保存即可。
另外,如果要使用多对一关系,我们只需要在Student实体类中使用@ManyToOne
注解和@JoinColumn
注解进行配置即可,不再赘述。
以上就是Hibernate的一对一、一对多/多对一关联保存的实现攻略了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Hibernate的一对一,一对多/多对一关联保存的实现 - Python技术站