1.今天在一个DAO中尝试对一个数据执行先查询再更新的操作,结果后台提示出现了sql语句?
?Hibernate:??????????????select group_id from fnd_groupid where id= ?
Hibernate:??????????? ?update fnd_groupid set group_id= ? where id = ?
本来是很简单的一个操作,但是数据库里面的值却始终不更新。
之前的代码如下:
SQLQuery query = this.getSession().createSQLQuery("select group_id from fnd_groupid where id= ?"); query.setLong(0, 1L); Long nextVal = StringTools.parseLong(query.uniqueResult().toString()); SQLQuery queryUpdate = this.getSession().createSQLQuery("update fnd_groupid set group_id= ? where id = ? "); queryUpdate.setLong(0, nextVal+1); queryUpdate.setLong(1, 1l); queryUpdate.executeUpdate();
?
后来google一下,才发现我的操作很有问题,我连续取出当前会话进行操作,前面的查询操作可以进行,但是此时会话还在进行中,我后面再次取到当前会话,并执行更新操作,这个操作始终无法完成。多次操作应该使用事务,只有提交事务之后才会生效。这其中涉及到hibernate的一级缓存机制。
这说明埋头写代码真的没啥用,原理的东西很多尚待研究,任重而道远~~
修改后的代码如下:
Session session = this.getSession(); Transaction transaction = session.beginTransaction();//启动事务 SQLQuery query = session.createSQLQuery("select group_id from fnd_groupid where id= ?"); query.setLong(0, 1L); Long nextVal = StringTools.parseLong(query.uniqueResult().toString()); SQLQuery queryUpdate = session.createSQLQuery("update fnd_groupid set group_id= ? where id = ? "); queryUpdate.setLong(0, nextVal+1); queryUpdate.setLong(1, 1l); queryUpdate.executeUpdate(); transaction.commit(); session.close(); return nextVal;
?
?