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();
}
}