当前位置:编程学习 > JAVA >>

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 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,