Hibernate读书笔记-----Hibernate的关联映射之N-1关联映射
我们所生活的世界很少有事物是孤立存在的,每个事物必然会存在着与它相关联的事物。在面向对象设计当中,关联关系是非常重要的。关联关系一般可以分为以下两种:
单向关系:只需单向访问关联端
双向关系:关联的两端都可以互相访问
单向关系可分为:1—N、1—1、N—1、N—N
双向关系可分为:1—1 、1—N、N—N
下面就上面的每种关联映射分别讲解:
一、N—1关联映射
1、单向N—1关联
1.1、无连接表的N-1关联(基于外键的N-1关联)
对于单向的N—1关联而言只需要从N的一端可以访问1的一端。为了让这个两个持久化类支持这种关联映射,程序应该在N的一端的持久化类中增加一个熟悉,该属性引用1一端的关联实体。
两个关联属性如下(以员工和部门之间的关系为例):
Employee:
[java]
public class Employee {
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:
[java]
public class Department {
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端增加了Department属性,该属性并不是一个普通的组件属性,而是引用另一个持久化类的类。Hibernate使用<many-to-one.../>元素映射N—1的关联实体,直接采用<many-to-one.../>元素来映射关联实体将会在N的一端的数据表中增加一个外键,用于参照主表记录。
下面为两个实体的映射文件:
Employee.hbm.xml
在这个映射文件中需要用<many-to-one../>来完成关联映射
[html] view plaincopyprint?
<hibernate-mapping package="com.hibernate.domain">
<class name="Employee" table="employee">
<id name="id" column="employeeID">
<generator class="native" />
</id>
<property name="name" column="employeeName" />
<!-- 用于映射N-1关联实体,指定关联实体类为 :Department,指定外键为:departmentID-->
<many-to-one class="Department" name="department" column="departmentID" not-null="true" cascade="all"/>
</class>
</hibernate-mapping>
Department.hbm.xml
[html]
<hibernate-mapping package="com.hibernate.domain" >
<class name="Department" table="department">
<id name="id" column="departmentID">
<generator class="native" />
</id>
<property name="name" column="departmentName" />
</class>
</hibernate-mapping>
通过上面的映射后,就可以使用如下代码来保存Employee和Department实体了。
[java] view plaincopyprint?
//增加
static void add() {
Session s = null;
Transaction tx = null;
try {
s = HibernateUtil.getSession();
tx = s.beginTransaction();
Department depart = new Department(); //....1
depart.setName("组织部");
Employee emp = new Employee();
//对象模型:建立两个对象的关联关系
emp.setDepartment(depart); &nbs
补充:软件开发 , Java ,