首先准备两个实体类:employees和department
employees多对一department,所以用到的是onetomany和manytoone
关系映射主要是在配置文件上多以重点关注配置文件的配置属性
首先创建实体类
/** * 部门 * * @author tyg * */ public class Department { private Integer id; private String name; private Set<Employee> employees = new HashSet<Employee>(); // 关联的很多员工 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; } @Override public String toString() { return "[Department: id=" + id + ", name=" + name + "]"; } } }
员工实体类
package cn.itcast.f_hbm_oneToMany; /** * 员工 * * @author tyg * */ 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; } @Override public String toString() { return "[Employee: id=" + id + ", name=" + name + "]"; } }
第二步,写demparment和employees的配置文件
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.itcast.f_hbm_oneToMany"> <class name="Department" table="department"> <id name="id"> <generator class="native"></generator> </id> <property name="name"/> <!-- employees属性,Set集合,表达的是本类与Employee的一对多 class属性:关联的实体类型 key子元素:对方表中的外键列(多方的那个表) inverse属性: 默认为false,表示本方维护关联关系。 如果为true,表示本方不维护关联关系。 只是影响是否能设置外键列的值(设成有效值或是null值),对获取信息没有影响。 cascade属性: 默认为none,代表不级联。 级联是指操作主对象时,对关联的对象也做相同的操作。 可设为:delete, save-update, all, none ...--> <set name="employees" cascade="all"> <key column="departmentId"></key> <one-to-many class="Employee"/> </set> </class> </hibernate-mapping>
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.itcast.f_hbm_oneToMany"> <class name="Employee" table="employee"> <id name="id"> <generator class="native"></generator> </id> <property name="name" type="string" column="name"/> <!-- department属性,表达的是本类与Department的多对一 class属性:关联的实体类型 column属性:外键列(引用关联对象的表的主键) --> <many-to-one name="department" class="Department" column="departmentId"></many-to-one> </class> </hibernate-mapping>
最后一步进行测试环节:
以保存为例,主要是分为五步来
1.创建session
2.给session配置属性
3.创建存入对象
4.给对象建关联关系
5.保存对象
6.提交事务,关闭session
private static SessionFactory sessionFactory = new Configuration()// .configure()// .addClass(Department.class)// 添加Hibernate实体类(加载对应的映射文件) .addClass(Employee.class)// 添加Hibernate实体类(加载对应的映射文件) .buildSessionFactory(); // 保存,有关联关系 @Test public void testSave() throws Exception { Session session = sessionFactory.openSession(); session.beginTransaction(); // -------------------------------------------- // 新建对象 Department department = new Department(); department.setName("开发部"); Employee employee1 = new Employee(); employee1.setName("张三"); Employee employee2 = new Employee(); employee2.setName("李四"); // 关联起来 employee1.setDepartment(department); employee2.setDepartment(department); department.getEmployees().add(employee1); department.getEmployees().add(employee2); // 保存 // session.save(employee1); // session.save(employee2); session.save(department); // 保存部门 // -------------------------------------------- session.getTransaction().commit(); session.close(); }
下面是获取关联对象,删除关联对象,接触关联关系的测试类代码
// 获取,可以获取到关联的对方 @Test public void testGet() throws Exception { Session session = sessionFactory.openSession(); session.beginTransaction(); // -------------------------------------------- // 获取一方,并显示另一方信息 Department department = (Department) session.get(Department.class, 1); System.out.println(department); System.out.println(department.getEmployees()); // Employee employee = (Employee) session.get(Employee.class, 1); // System.out.println(employee); // System.out.println(employee.getDepartment()); // -------------------------------------------- session.getTransaction().commit(); session.close(); } // 解除关联关系 @Test public void testRemoveRelation() throws Exception { Session session = sessionFactory.openSession(); session.beginTransaction(); // -------------------------------------------- // // 从员工方解除 // Employee employee = (Employee) session.get(Employee.class, 1); // employee.setDepartment(null); // 从部门方解除(与inverse有关系,为false时可以解除) Department department = (Department) session.get(Department.class, 1); department.getEmployees().clear(); // -------------------------------------------- session.getTransaction().commit(); session.close(); } // 删除对象,对关联对象的影响 @Test public void testDelete() throws Exception { Session session = sessionFactory.openSession(); session.beginTransaction(); // -------------------------------------------- // // 删除员工方(多方),对对方没有影响 // Employee employee = (Employee) session.get(Employee.class,2); // session.delete(employee); // 删除部门方(一方) // a, 如果没有关联的员工:能删除。 // b, 如果有关联的员工且inverse=true,由于不能维护关联关系,所以会直接执行删除,就会有异常 // c, 如果有关联的员工且inverse=false,由于可以维护关联关系,他就会先把关联的员工的外键列设为null值,再删除自己。 Department department = (Department) session.get(Department.class, 4); session.delete(department); // -------------------------------------------- session.getTransaction().commit(); session.close(); }
end《===