瞬时态:
在Java里new出来的就是瞬时态,没有OID,与session无关联,可通过save或update变为持久态。
持久态:
对象有OID,对象有session管理着,那么它就是持久态
托管态:
持久态的对象在session关闭以后它就是托管(脱离session管理)态,此时有OID,无session管理
删除状态:
只有持久态的对象才能被删除,持久态中的对象,调用了delete()方法之后,commit()之前,它是删除状态,一旦commit(),这个对象就没有了。
这里多补充一点,我们的对象不论是瞬时态还是托管态,我们都可以调用save()方法和update()方法。如果我们自己赋予了id值,在调用session.save()方法向数据库插入数据的时候我们设置的id是没有用的,hibernate生成的insert语句只会向数据库插入后吗的字段值,而id是由主键生成策略自动生成。对于update()方法,一个对象设置好id及其他属性值后,再去调用session.update()方法是可以的,只是这个id在数据库中需要有对应的记录,否则会报错。
再来段代码:
//hibernate中的三种状态 @Test public void test() { User user = new User(); user.setUsername("hahahaha"); user.setPassword("123456");//对象是瞬时态 System.out.println(user.getId());//此时id值是没有但,是默认的0 Session session = SessionFactoryUtils.getSessionFactory().openSession(); Transaction tx = session.beginTransaction(); session.save(user);//对象是持久态,此时数据库中并没有这条记录,因为已经插入但还没commit,但这条数据已经存到session一级缓存里了 User user1 = session.get(User.class,Integer.parseInt(user.getId()+""));//这一步访问user.getId()已经有值了。 System.out.println(user == user1);//两个对象是同一个 tx.commit(); session.close(); }
运行结果如下:
0 log4j:WARN No appenders could be found for logger (org.jboss.logging). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. org.hibernate.internal.SessionFactoryImpl@21c64522 Hibernate: insert into user (username, password) values (?, ?) true