package com.rlovep.one2many; import java.util.HashSet; import java.util.Set; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; import org.junit.Test; public class App { private static SessionFactory sf=null; static{ Configuration config=new Configuration().configure().addClass(Dept.class).addClass(Employee.class); //创建serviceRegistry 代替buildSessionFactory()方法 ServiceRegistry serviceRegistry =new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry(); // 创建session的工厂对象 sf = config.buildSessionFactory(serviceRegistry); } //测试保存:一对多的保存 //是否设置inverse 对保存的影响 // 为false时能正常保存,多输出两条update语句; // 为true时能保存,没有update语句,但是员工表,不能关联到部门表 @Test public void testSave1(){ Session session = sf.openSession(); Transaction tx = session.beginTransaction(); //创建对象 Employee employee=new Employee(); Employee employee2=new Employee(); employee.setEname("peace4"); employee.setSalary(300); employee2.setEname("peace5"); employee2.setSalary(499); //关系set创建 Set<Employee>emps=new HashSet<>(); emps.add(employee); emps.add(employee2); //创建dept Dept dept=new Dept(); dept.setDname("ptoo13项目"); dept.setEmps(emps); //持久化 session.save(dept); tx.commit(); session.close(); } //测试保存:多对一的保存,推荐:少了两条update的语句 //是否设置inverse 对保存的影响,没有影响; (因为先保存了employee) @Test public void testSave2(){ Session session = sf.openSession(); Transaction tx = session.beginTransaction(); //创建对象 Employee employee=new Employee(); Employee employee2=new Employee(); employee.setEname("peace6"); employee.setSalary(300); employee2.setEname("peace6"); employee2.setSalary(499); //创建dept Dept dept=new Dept(); dept.setDname("ptoo6项目"); //关系创建: employee.setDept(dept); employee2.setDept(dept); //持久化 session.save(dept); session.save(employee); session.save(employee2); tx.commit(); session.close(); } // 测试get 是否设置inverse,对获取数据的影响? 无. @Test public void testget() { Session session = sf.openSession(); Transaction tx = session.beginTransaction(); // 通过部门获得employee Dept dept = (Dept) session.get(Dept.class, 4); System.out.println(dept.getEmps());// 默认使用懒加载模式 // 通过员工获得部门 Employee employee = (Employee) session.get(Employee.class, 1); System.out.println(employee.getDept().getDname()); tx.commit(); session.close(); } // 是否设置inverse属性,在删除数据中对关联关系的影响? // inverse=false, 有控制权, 可以删除。先清空外键引用,再删除数据。 // inverse=true, 没有控制权: 如果删除的记录有被外键引用,会报错,违反主外键引用约束! // 如果删除的记录没有被引用,可以直接删除。 @Test public void delete() { Session session = sf.openSession(); session.beginTransaction(); Dept dept = (Dept) session.get(Dept.class,3); session.delete(dept); // 级联删除 session.getTransaction().commit(); session.close(); } // 3. 是否设置inverse,对解除关联关系影响? // inverse=false, 可以解除关联 // inverse=true, 当前方(部门)没有控制权,不能解除关联关系(不会生成update语句,也不会报错) // @Test public void removeRelation() { Session session = sf.openSession(); session.beginTransaction(); // 获取部门 Dept dept = (Dept) session.get(Dept.class,4); // 解除关系 dept.getEmps().clear(); session.getTransaction().commit(); session.close(); } }