都知道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也没有任何关系,把他叫脱管对象也没有错,而叫游离的似乎也可以,反正就一个概念罢了。其实搞这么多概念坑了好多人,哎。。。