第 2 章 hibernate关联映射 【hibernate部分】

一)为什么要学习hibernate关联映射?

        ①.    面向对象的数据和关系型数据都存在“关联”这种特性。客观上需要将这种特性在ORM时进行映射。

        ②.    配置了关联映射可以更大限度地简化编码,使我们在编写程序时可以完全按照面向对象的方式进行思考和实现。

 

二)各个映射都用在什么情况下?

             常用的关联关系有:one - to - many 关联和many to one关联。many to many 在特定场合下也会用到。

          根据业务需要确定关联的配置:

          根据业务需要配置单向或双向关联。也就是说,只需要从一方获取另一方的数据时就使用单向关联,双方都需要    获取对方数据时 就使用双向关联。

          根据业务需要配置inverse属性和cascade属性。

          以部门和人员为例,说明应用场合:

          ①.    使用人员时:

                 如果只需要获取对应部门信息(user.getDeptarment()),而不需要查看部门下的人员信息时,就配置成单向多对一

          ②.    使用部门时:

                如果只需要获取部门下人员信息(deptartmanet.getUsers()),不需要根据人员获取部门信息时,就配置成单向一对多

          ③.    既要获取部门下人员 deptartmanet.getUsers(), 又要从人员获取部门信息 user.getDeptarment()那就配置成双向一对多, 也就是双向多对一

          ④.    以学员和考试科目的关系为例,一个学员参加多个考试科目,一个考试科目可以由多个学员参加。这就可以应用多对多关联

 

三)各个映射都怎么用?

举例: 街道和区的关系, 表结构如下: 


      1. 如配置单向多对一关联关系?

答:举例,街道和区的关系

  实体类:

public class District implements java.io.Serializable {
    private Long id;
    private String name;   
    ...
}
public class Street implements java.io.Serializable {
    private Long id;
    private District district;
    private String name;
    ...
}

   映射文件:

Street.hbm.xml
<many-to-one name="district" class="cn.jbit.houserent.bean.District">
       <column name="district_id"  />
</many-to-one>

 

 2.如何配置单向一对多关联关系?

答:举例,区和街道的关系

实体类:

public class District implements java.io.Serializable {
    private Long id;
    private String name;
    private Set streets = new HashSet();
    ...
}
public class Street implements java.io.Serializable {
    private Long id;
    private Long district_id;
    private String name;
    ...
}

 映射文件:

District.hbm.xml
<set name="streets" table="street“>
     <key>
         <column name="district_id"/>
     </key>
     <one-to-many class="cn.jbit.houserent.bean.Street" />
</set>

 

3.如何配置双向一对多关联关系?

答:举例,区和街道的关系

实体类:

public class District implements java.io.Serializable {
    private Long id;
    private String name;
    private Set streets = new HashSet();
    ...
}
public class Street implements java.io.Serializable {
    private Long id;
    private District district;
    private String name;
    ...
}

   映射文件:

District.hbm.xml
<set name="streets" table="street“>
     <key>
         <column name="district_id"/>
     </key>
     <one-to-many class="cn.jbit.houserent.bean.Street" />
</set>
Street.hbm.xml
<many-to-one name="district" class="cn.jbit.houserent.bean.District">
       <column name="district_id"  />
</many-to-one>

4.如何配置多对多关联关系?

举例: 雇员与项目的关系, 表结构如下: 


      实体类:

public class Project  implements Serializable {
	private Integer project_id;
	private String project_name;
	private Integer project_desc;
	private Set<Employee> employees = new HashSet<Employee>();
	….
} 
public class Employee {
	private Integer employee_id;
	private String employee_name;
	private Integer employee_desc;
	private Set<Project> projects = new HashSet<Project>();
	……
}

    映射文件:

   Project.hbm.xml

<class name="Project" table="project" >
	……
    <set name=" employees " table="r_emp_proj">
        <key column="r_proj_id" />
        <many-to-many class="cn.jbit.aptech.jb.entity.Employee"
            column="r_emp_id" />
    </set>
</class> 

Employee.hbm.xml
<class name="Employee" table="employee" >
	…….
    <set name=" projects " table="r_emp_proj" inverse="true">
        <key column="r_emp_id" />
        <many-to-many class="cn.jbit.aptech.jb.entity.Project"
            column="r_proj_id" />
    </set>
</class>

四)cascade属性

当设置了cascade属性不为none时,Hibernate 会自动持久化所关联的对象

根据业务需要设置cascade的属性。

 

五)inverse属性

      术语“inverse”直译为反转

      在Hibernate 中,inverse属性指定了关联关系中的方向

      关联关系中,inverse="false" 的为主动方,由主动方负责维护关联关系

      在一对多关联中,将one 方的inverse 设置为true,这将有助性能的改善

例:

 

猜你喜欢

转载自yanln.iteye.com/blog/1592605