Hibernate对象状态之间的神奇转换 (2)

对于对象状态有了一定的了解之后,可以用来解释很多现象。
在Hibernate中,唯有当对象从其它状态转为持久态时,它才会去自动生成sql语句,其它时候是不会去重复生成sql,这就是Hibernate框架提高效率的关键所在。
例如:

@Test public void test2() { Session session = HibernateUtil.getSession(); Transaction transaction = session.beginTransaction(); Person p = new Person(); p.setPname("李四"); p.setAge(30); session.save(p); p.setPname("王五"); session.update(p); transaction.commit(); session.close(); }

我在transaction.commit();这条语句上打了一个断电,然后调试运行。

在这里插入图片描述


可以看到,控制台只输出了一条sql语句,也就是执行save()方法时生成的插入语句,但是执行update()方法却并没有生成sql。这是因为在执行update()方法时,Hibernate框架会去判断当前对象的状态,它发现当前对象处于持久态,所以不重复生成sql,只是将持久态对象的值改变而已,然后调用commit()方法进行事务提交的时候才去生成更新语句。

我们继续看一个例子:

@Test public void test2() { Session session = HibernateUtil.getSession(); Transaction transaction = session.beginTransaction(); Person p = new Person(); p.setPname("张三"); p.setAge(30); session.save(p);//此时该对象从瞬时态转为持久态,生成sql语句 p.setPname("王五"); session.save(p);//此时该对象为持久态,不生成sql语句 p.setPname("赵六"); session.update(p);//此时该对象为持久态,不生成sql语句 transaction.commit(); session.close(); }

你要知道,这跟你调用哪个方法是无关的,关键在于对象的状态,只有转为持久态时才会生成sql语句。所以上面的程序段依然只会产生两条sql,一条是save()方法产生的,一条是commit()方法产生的。
控制台信息如下:

Hibernate: insert into PERSON (PNAME, AGE) values (?, ?) Hibernate: update PERSON set PNAME=?, AGE=? where PID=?

理解Hibernate的三种状态,将更有利于理解Hibernate的运行机制,这些可以让你在开发中对疑点问题的定位产生关键性的帮助。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwsfsf.html