hibenate中对象的四种状态

瞬时态:

在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

猜你喜欢

转载自blog.csdn.net/dimples_qian/article/details/80825790