标签:
一、hibernate中对象的状态有三种:
临时、游离和持久化,三种状态转化的方法都是通过session来调用的
什么是持久化?
通俗的讲,就是瞬时数据(比如内存中的数据,是不能永久保存的)持久化为持久数据(比如持久化至数据库中,能够长久保存)
二、三种状态的相互转换
session方法
session.save():该方法可以把一个对象从临时装填转换成持久化状态
session.get():从数据库中根据主键提取出一个对象,该对象就是一个持久化状态的对象
session.update():把一个对象变为持久化对象
session.evict():把一个持久化状态的对象变为脱管状态
session.clear():把所有Hibernate中的持久化状态的对象变为脱管状态的对象
三、测试session的各个方法
public class SessionfatoryTest { SessionFactory factory; Session session ; Transaction transaction; @Before public void init(){ factory = HibernateUtils.getSessionFactory(); session = factory.openSession(); transaction = session.beginTransaction(); } /** * 把一个临时对象变为持久化对象 */ @Test public void testSave(){ User user = new User(); user.setAge(11); user.setName("aaaa"); session.save(user); } @Test public void testGet(){ User user = (User) session.get(User.class, 1); System.out.println(user); } @Test public void testUpdate(){ User user = (User) session.get(User.class, 1); user.setAge(102); //session.update(user); //因为user本身就是持久化对象,所以即使不写session.update(),在 //transaction.commit()时也会发出SQL语句,因为该对象的数据与 //hibernate中的该对象的快照(副本)不一致,在flush()时,就会发出sql } @Test public void testUpdate2(){ User user = (User) session.get(User.class, 1); session.evict(user);//脱管状态 user.setAge(100); session.update(user);//变为持久化状态 } @After public void destory(){ transaction.commit(); session.close(); factory.close(); } }
四、Hibernate对象的副本(快照)
每次进行transaction.commit()时,都会进行flush操作,进而进行对象与副本的数据对比,决定是否发送sql语句,比如取出的user的age是10,又改为10,user.setAge(10);那么这样是不会发送sql语句的。
版权声明:本文为博主原创文章,未经博主允许不得转载。
Hibernate学习笔记(二) — 探索 hibernate 中对象的状态
标签:
原文地址:http://blog.csdn.net/wjw0130/article/details/47321723