一)为什么要学习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,这将有助性能的改善
例: