1,save()方法 将一个临时对象转变成持久化对象;
2,load()方法 VS get()方法
都是根据 OID 从数据库中加载一个持久化对象。
区别 1:假如数据库中不存在与 OID 对应的记录,Load()方法会抛出异常,而 get()方法返回 null;
区别 2:load 方法默认采用延迟加载策略,get 方法采用立即检索策略;
举例说明:
@Test
public void testLoadClass(){
// Class c=(Class)session.load(Class.class, Long.valueOf(2));
Class c=(Class)session.load(Class.class, Long.valueOf(1));//运行到这里c的值为null
System.out.println(c.getStudents()); //延迟加载,这里c.getStudents()用到了c,c就会加载有值了
}
2,update()方法 将一个游离对象转变为持久化对象;
举例说明:
@Test
public void testUpdateClass(){
Session session1=sessionFactory.openSession();
session1.beginTransaction();
Class c=(Class)session1.get(Class.class, Long.valueOf(1));
session1.getTransaction().commit(); // 提交事务完之后,c变成游离对象
session1.close();
Session session2=sessionFactory.openSession();
session2.beginTransaction();
c.setName("08计算机本科2");
session2.update(c); update方法,c对象变成持久化对象
session2.getTransaction().commit(); // 提交事务
session2.close();
}
3,saveOrUpdate()方法 包含了 save()和 update()方法;
举例说明:
@Test
public void testSaveOrUpdateClass(){
Session session1=sessionFactory.openSession();
session1.beginTransaction();
Class c=(Class)session1.get(Class.class, Long.valueOf(1));
session1.getTransaction().commit(); // 提交事务
session1.close();
Session session2=sessionFactory.openSession();
session2.beginTransaction();
c.setName("08计算机本科3");
Class c2=new Class();
c2.setName("09计算机本科3");
// c2临时对象,调用saveOrUpdate方法是插入09计算机本科3这条数据
//c是游离对象,调用saveOrUpdate方法是执行更新操作,把oid为1的c对象的班级名更新为08计算机本科3
session2.saveOrUpdate(c);
session2.saveOrUpdate(c2);
session2.getTransaction().commit(); // 提交事务
session2.close();
}
4,merge()方法,合并对象;
@Test
public void testMergeClass(){
Session session1=sessionFactory.openSession();
session1.beginTransaction();
Class c=(Class)session1.get(Class.class, Long.valueOf(1));
session1.getTransaction().commit(); // 提交事务
session1.close();
Session session2=sessionFactory.openSession();
session2.beginTransaction();
Class c2=(Class)session2.get(Class.class, Long.valueOf(1));
c.setName("08计算机本科4");
session2.update(c);
session2.getTransaction().commit(); // 提交事务
session2.close();
}
当代码是 session2.update(c);会报错
Class c=(Class)session1.get(Class.class, Long.valueOf(1));
Class c2=(Class)session2.get(Class.class, Long.valueOf(1));
session2缓存中已经有oid为1的对象c2,当更新c时会报错
解决办法: session2.update(c);这段代码改为 session2.merge(c); 用来合并session2缓存中的oid同为1的对象c和c2
5,delete()方法,删除对象;
采用延迟加载的方式获得要删除对象
@Test
public void testDeleteStudent(){
Student student=(Student)session.load(Student.class, Long.valueOf(1));
session.delete(student);
}