Hibernate一对多和多对一双向关联映射

Department部门和Employee员工是一对多的关系,再多的一端会有一个外键来维护关系,即多的一端是关系的维护端,少的一端为关系的被维护端。

Hibernate 中文手册 PDF

部门实体Department.java:

/**
 * 部门和员工的关系为一对多,多的一端为关系的维护端,
 * 关系的维护端来负责外键的更新,少的一端无权更新外键字段。
 * @author Liao
 */
public class Department {

/* 部门Id */
 private Integer id;
 /* 部门名称 */
 private String name;
 /* 部门和员工的关系(一对多) */
 private Set<Employee> employees;

public Integer getId() {
  return id;
 }

public void setId(Integer id) {
  this.id = id;
 }

public String getName() {
  return name;
 }

public void setName(String name) {
  this.name = name;
 }

public Set<Employee> getEmployees() {
  return employees;
 }

public void setEmployees(Set<Employee> employees) {
  this.employees = employees;
 }

}

员工实体Employee.java:

public class Employee {

/* 员工ID */
 private Integer id;
 /* 员工名称 */
 private String name;
 /* 员工和部门的关系(多对一) */
 private Department department;

public Integer getId() {
  return id;
 }

public void setId(Integer id) {
  this.id = id;
 }

public String getName() {
  return name;
 }

public void setName(String name) {
  this.name = name;
 }

public Department getDepartment() {
  return department;
 }

public void setDepartment(Department department) {
  this.department = department;
 }

}

Department.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- package表示实体类的包名 -->       
<hibernate-mapping package="com.lixue.bean">
 <!-- class结点的name表示实体的类名,table表示实体映射到数据库中table的名称 -->
 <class table="t_department">
  <id column="did">
   <!-- 自增长 -->
   <generator/>
  </id>
  <property column="dname"/>
 
  <!-- 部门和员工的关系(一对多) -->
  <set cascade="save-update">
   <key column="dept_id"/><!-- 表示在多的一端加一个字段 -->
   <one-to-many/>
  </set>
 </class>
</hibernate-mapping>

Employee.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- package表示实体类的包名 -->       
<hibernate-mapping package="com.lixue.bean">
 <!-- class结点的name表示实体的类名,table表示实体映射到数据库中table的名称 -->
 <class table="t_employee">
  <id column="eid">
   <!-- 自增长 -->
   <generator/>
  </id>
  <property column="ename"/>
  <!-- 设置Employee和Department的关系column表示和Department.hbm.xml文件的外键映射要一致 -->
  <many-to-one column="dept_id"/>
 </class>
</hibernate-mapping>

注:Employee为多的一端,作为关系的维护端,通过一个外键即dept_id来维护。

测试类:

public class One2ManyTest {

public static void main(String[] args) {
 
  Session session = HibernateUtils.getSession();
  Transaction transaction = session.beginTransaction();
 
  /*创建部门并设置属性*/
  Department department = new Department();
  department.setName("开发部");
  session.save(department);
 
  /*创建员工并设置属性*/
  Employee employee = new Employee();
  employee.setName("习近平");
  employee.setDepartment(department);
 
  session.save(employee);
 
  transaction.commit();
 }
}

注:我这里只是随便测试了一下,并未关闭Session和Transaction。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/35f8d1bb36f7ecc4354621954596f786.html