码迷,mamicode.com
首页 > Web开发 > 详细

Hibernate学习笔记(二) — 探索 hibernate 中对象的状态

时间:2015-08-06 22:34:25      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:

一、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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!