Hibernate对象的生命周期

      都知道Hibernate的对象有三态,即游离态、持久态、脱管态。那么这三种状态的对象到底怎么区别呢?我做了一个小的测验。

		User user = new User();
		user.setId(4);
		user.setUsername("heyuanling2");
		user.setAge(23);
		user.setSex("w");
		user.setPassword("heyuanling");
		Session session = this.getSession();
		Transaction tr = session.beginTransaction();
		//User exituser = (User)session.get(User.class, new Integer(1));
		session.update(user);
		tr.commit();
		//User uu = (User)session.merge(user);
		//System.out.println(uu.getUsername());
		session.close();

      大家注意到,这里我们给这个刚创建的对象设置了Id,这样当我们使用update的时候,hibernate就会根据id去数据库里更新该记录,当然前提是id为4的记录在数据库里必须存在。那如果我们不设置id呢?结果就会报错。看来,Hibernate所宣称的持久化对象,不过就是拥有了id值的一个POIO对象罢了。因为在session里做数据库的操作时,hibernate会自然的帮我设置上id值。所以我认为,游离态和持久态对象的唯一差别就是有没有id号。

      那脱管和持久又有什么区别呢?很简单,脱管就是不在session管制之下,也就是session已经关闭了而已。其实在内存里,不管你session是不是关闭了,你的POJO对象还是存在的,没有被消亡,总要给它取个名字吧,所以就叫脱管。那我们也可以这么理解,上面程序当中的user对象也是脱管的,因为人家有id,数据库里有对应的记录,而且在session.update(user)之前它跟session也没有任何关系,把他叫脱管对象也没有错,而叫游离的似乎也可以,反正就一个概念罢了。其实搞这么多概念坑了好多人,哎。。。

猜你喜欢

转载自littie1987.iteye.com/blog/1039005