1.Hibernate环境的搭建步骤:
----》 引入jar:hibernate.jar + required + jpa + 驱动包
---》hibernate.cfg.xml
---》 javabean/*.hbm.xml
---》Application 测试
2. 关联映射
需求1:
部门与员工
一个部门有多个员工; 【一对多】
多个员工,属于一个部门 【多对一】
需求2:
项目与开发员工
一个项目,有多个开发人员!
一个开发人员,参与多个项目! 【多对多】
3.先讲解双向一对多映射【一个部门对应多个员工】
部门的实体类:
public class Dept {
private int deptId;
private StringdeptName;
// 【一对多】部门对应的多个员工
private Set<Employee>emps = new HashSet<Employee>();
}
员工的实体类
public class Employee {
private int empId;
private StringempName;
private double salary;
// 【多对一】员工与部门
private Deptdept;
部门 Dept的映射文件
<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mappingpackage="cn.itcast.b_one2Many">
<classname="Dept"table="t_dept">
<idname="deptId">
<generatorclass="native"></generator>
</id>
<propertyname="deptName"length="20"></property>
<!--
一对多关联映射配置 (通过部门管理到员工)
Dept 映射关键点:
1. 指定映射的集合属性: "emps"
2. 集合属性对应的集合表: "t_employee"
3. 集合表的外键字段 "t_employee. dept_id"
4. 集合元素的类型
-->
<setname="emps"> <!-- table="t_employee" -->
<keycolumn="dept_id"></key>
<one-to-manyclass="Employee"/>
</set>
</class>
</hibernate-mapping>
员工的配置文件
<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mappingpackage="cn.itcast.b_one2Many">
<classname="Employee"table="t_employee">
<idname="empId">
<generatorclass="native"></generator>
</id>
<propertyname="empName"length="20"></property>
<propertyname="salary"type="double"></property>
<!--
多对一映射配置
Employee 映射关键点:
1. 映射的部门属性 : dept
2. 映射的部门属性,对应的外键字段: dept_id,与部门实体类的映射文件中的外键字段要一致
3. 部门的类型
-->
<many-to-onename="dept"column="dept_id"class="Dept"></many-to-one>
</class>
</hibernate-mapping>
测试类
// 保存,部门方【一的一方法操作】
@Test
public void save() {
Session session = sf.openSession();
session.beginTransaction();
// 部门对象
Dept dept = new Dept();
dept.setDeptName("应用开发部");
// 员工对象
Employee emp_zs = new Employee();
emp_zs.setEmpName("张三");
Employee emp_ls = new Employee();
emp_ls.setEmpName("李四");
// 关系
dept.getEmps().add(emp_zs);
dept.getEmps().add(emp_ls);
// 保存
session.save(emp_zs);
session.save(emp_ls);
session.save(dept); // 保存部门,部门下所有的员工
session.getTransaction().commit();
session.close();
// 【推荐】保存,部员方【多的一方法操作】
@Test
public void save2() {
Session session = sf.openSession();
session.beginTransaction();
// 部门对象
Dept dept = new Dept();
dept.setDeptName("综合部");
// 员工对象
Employee emp_zs = new Employee();
emp_zs.setEmpName("张三");
Employee emp_ls = new Employee();
emp_ls.setEmpName("李四");
// 关系
emp_zs.setDept(dept);
emp_ls.setDept(dept);
// 保存
session.save(dept); // 先保存一的方法
session.save(emp_zs);
session.save(emp_ls);// 再保存多的一方,关系回自动维护(映射配置完)
session.getTransaction().commit();
session.close();
总结:
在一对多与多对一的关联关系中,保存数据最好的通过多的一方来维护关系,这样可以减少update语句的生成,从而提高hibernate的执行效率!
配置一对多与多对一,这种叫“双向关联”
只配置一对多, 叫“单项一对多”
只配置多对一, 叫“单项多对一”