一、Hibernate四种对象操作
临时状态 :
Class c1=new Class(); // 临时对象1
c1.setName("08计本");
Class c2=new Class(); // 临时对象2
c2.setName("09计本");
持久化状态: 放到了session缓存中
session.save(c1); // 持久化对象
session.save(c2); // 持久化对象
// 提交事务才执行sql语句,此时数据还不在数据库中,
session.getTransaction().commit(); //提交事务
删除状态:session.delete(h);
session.delete(c2); // 删除对象
session.getTransaction().commit(); // 提交事务
session.close(); // 关闭session
System.out.println(c2.getName()); // 删除对象
游离状态:数据已经持久化,但不在session中
session.getTransaction().commit(); // 提交事务
session.close(); // 关闭session
System.out.println(c1.getName()); // 游离对象,可以打印出来
二、Session常用方法
1.save(临时对象变持久化对象)
2.load() VS get()
用法:获取对象是为了删除它用load(),获取对象是为了访问它的属性,用get()
现在数据库有一条数据
load()
Class c=(Class)session.load(Class.class, Long.valueOf(2));
System.out.println(c);
报错
get()
Class c=(Class)session.load(Class.class, Long.valueOf(2));
System.out.println(c);
值为空
延迟加载
打断点执行了Class c=(Class)session.load(Class.class, Long.valueOf(1));
但数据库还是没有取到值
立即检索策略
执行Class c=(Class)session.get(Class.class, Long.valueOf(1));就从数据库取到值了
3.update():游离对象变成持久化对象
@Test
public void testSaveOrUpdateClass(){
//更新操作
Session session1=sessionFactory.openSession();
session1.beginTransaction();//开启事务
Class c=(Class)session1.get(Class.class, Long.valueOf(1));
session1.getTransaction().commit(); // 提交事务
//关闭session,c从持久化对象变成游离对象
session1.close();
Session session2=sessionFactory.openSession();
session2.beginTransaction();
c.setName("08计算机本科2");
//加游离对象变成持久化对象,更新数据库
session2.update(c);
session2.getTransaction().commit(); // 提交事务
session2.close();
}
原本数据,更新之后
4.saveOrUpdate()
包含了save()方法和update()方法,就是说如果对象是临时状态就使用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();
//c是游离对象saveOrUpdate(c);执行更新操作
Session session2=sessionFactory.openSession();
session2.beginTransaction();
c.setName("08计算机本科3");
//c2是对象临时对象,saveOrUpdate(c);执行添加操作
Class c2=new Class();
c2.setName("09计算机本科3");
session2.saveOrUpdate(c);
session2.saveOrUpdate(c2);
session2.getTransaction().commit(); // 提交事务
session2.close();
}
原数据库:改变后数据库:
5.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
session1.close();
//c是OID的=1游离状态对象
Session session2=sessionFactory.openSession();
session2.beginTransaction();
//session2中获取一个OID的=1的对象持久化对象,放到session2中
Class c2=(Class)session2.get(Class.class, Long.valueOf(1));
c.setName("08计算机本科4");
//执行这句时,将游离状态的c放到session2中
//这样session2就会有两个OID=1的对象,就会报错,更新失败
session2.update(c);
session2.getTransaction().commit(); // 提交事务
session2.close();
}
使用merge()方法,可以解决,就是说调用merge可以发现session中有两个OID相同的对象,使两个对象合并再进行更新
更新操作使用merge()比update()好
6.delete()方法
@Test
public void testDeleteStudent(){
//删除用load,提高性能
Student student=(Student)session.load(Student.class, Long.valueOf(1));
session.delete(student);
// session1.getTransaction().commit(); 执行提交事务才删除数据库数据
}