|
ation; import org.junit.Test; public class App { 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(); } } 多对多 对于老师的hbm的配置文件应该是:
一定要一致 Key子元素:集合外键(引用当前表主键的那个外键) -->
对于学生类的hbm的配置文件应该是:
默认的是双方都维护中间表中这个数据库的数据,与inverse有关,inverse = true那么本方不维护。 多对多的时候inverse = false的时候,能维护关联关系,那么先接触关联关系然后再删除。但是inverse = true 的时候,如果本身不维护的话就直接删除但是这样会报错(因为存在着关联关系)。 Cascade属性 级联 默认的是none 操作本对象的时候对于与之关联的对象也做相同的操作 可以设置的值是delete,save-update,all,none 7. Session对象 Session.save(“”);Session.save(“”); Session.save(“”);Sess |