Hibernate_映射_关联关系_一对多多对一映射2、inverse属性

来源:互联网 发布:经济数据库都有什么 编辑:程序博客网 时间:2024/05/22 07:59

值类型的集合集合元素是普通类型实体类型的集合集合元素是另外一个实体一对多     多对一Department.hbm.xmlEmployee.hbm.xml要说明的信息有:要说明的信息有:1,集合表(员工表)1,关联的是什么类型2,集合外键2,外键列3,集合元素 关联的实例类型package cn.itcast.f_hbm_oneToMany;import java.util.HashSet;import java.util.Set;/** * 部门 *  * @author 风清杨 * @version V3.0 *  */public class Department {/** 部门id */private Integer id;/** 部门名称 */private String name;/** 员工信息 */private Set employee = new HashSet();// 关联的很多员工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 getEmployee() {return employee;}public void setEmployee(Set employee) {this.employee = employee;}@Overridepublic String toString() {return "Department [id=" + id + ", name=" + name + "]";}}package cn.itcast.f_hbm_oneToMany;/** * 员工部门 *  * @author 风清杨 * @version V3.0 *  */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;}@Overridepublic String toString() {return "Employee [id=" + id + ", name=" + name + "]";}}package cn.itcast.f_hbm_oneToMany;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.junit.Test;/** * 应用程序操作类 *  * @author 风清杨 * @version V3.0 *  */public class App {private static SessionFactory sessionFactory = new Configuration()//.configure()//.addClass(Department.class)//.addClass(Employee.class)//.buildSessionFactory();// 保存,有关联关系@Testpublic void testSave() throws Exception {Session session = sessionFactory.openSession();Transaction tx = null;try {tx = 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.getEmployee().add(employee1);department.getEmployee().add(employee2);// 保存session.save(department);session.save(employee1);session.save(employee2);// ------------------------------------tx.commit();} catch (RuntimeException e) {tx.rollback();throw e;} finally {session.close();}}// 获取,可以获取到关联的对方@Testpublic void testGet() throws Exception {Session session = sessionFactory.openSession();Transaction tx = null;try {tx = session.beginTransaction();// ------------------------------------// 获取一方数据,并显示另一方信息//Department department = (Department) session.get(Department.class,// 1);// System.out.println(department);// System.out.println(department.getEmployee());Employee employee = (Employee) session.get(Employee.class, 1);System.out.println(employee);System.out.println(employee.getDepartment());// ------------------------------------tx.commit();} catch (RuntimeException e) {tx.rollback();throw e;} finally {session.close();}}}


维护关联关系:就是设置外键列的值。

<!-- employee属性,Set集合,表达的是本类与Employee的一对多关系 class属性:关联的实体类型key子元素:对方表中的外键列(多方的那个表)inverse属性:默认为false,表示本方维护关联关系。如果为true,表示本方不维护关联关系。只是影响是否能设置外键的值(设成有效值或者是null值),对获取信息没有影响--><set name="employee" inverse="false"><key column="departmentId" /><one-to-many class="Employee" /></set>

// 解除关联关系@Testpublic void testRemoveRelation() throws Exception {Session session = sessionFactory.openSession();Transaction tx = null;try {tx = session.beginTransaction();// ------------------------------------// 从员工解除// Employee employee = (Employee) session.get(Employee.class, 1);// employee.setDepartment(null);// 从部门解除(与inverse有关系,为false时可以解除)Department department = (Department) session.get(Department.class,1);department.getEmployee().clear();session.update(department);// ------------------------------------tx.commit();} catch (RuntimeException e) {tx.rollback();throw e;} finally {session.close();}}// 删除对象,对关联对象的影响@Testpublic void testDelete() throws Exception {Session session = sessionFactory.openSession();Transaction tx = null;try {tx = 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,1);// department.getEmployee().clear();session.delete(department);// ------------------------------------tx.commit();} catch (RuntimeException e) {tx.rollback();throw e;} finally {session.close();}}


0 0
原创粉丝点击