首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate Java中的会话和事务

问Hibernate Java中的会话和事务
EN

Stack Overflow用户
提问于 2016-08-10 16:08:51
回答 1查看 9.9K关注 0票数 1

在Java Hibernate中,当我们需要处理DB时,我们需要: 1.打开会话2.开始事务3.完成事务4.关闭会话

  • 例如,如果我想获得学生列表: 公共静态列表getStudentList() { List l= null;会话会话= HibernateUtil.getSessionFactory().openSession();尝试{ String = "from Student";查询= session.createQuery( hql );l= query.list();} catch (HibernateException ex) {//日志异常System.err.println(ex);}最后{ session.close();}返回l};
  • 插入学生 公共静态布尔值( session s) { Session = HibernateUtil.getSessionFactory().openSession();if (. /* check如果已存在*/){返回假;}事务事务=空;尝试{ Transaction = session.beginTransaction();session.save(s);transaction.commit();} catch (HibernateException ex) {//日志异常transaction.rollback();System.err.println(ex);}最后{ session.close();}返回true;}

为什么getStudentList()中没有事务?提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-10 20:15:08

这个hibernate 文章解释了在事务中没有显式执行的SELECT操作的行为。

本文给出了下面的示例,但对于查询示例也是如此。

Session = sessionFactory.openSession(); session.get(Item.class,123 l); session.close();

  1. 一个新的会议开始了。此时它无法获得数据库连接。
  2. 调用get()将触发SQL SELECT。会话现在从连接池获得一个JDBC连接。默认情况下,Hibernate使用setAutoCommit(false)立即关闭此连接上的自动提交模式。这有效地启动了JDBC事务!
  3. SELECT在这个JDBC事务中执行。会话被关闭,连接返回到池中,并由JDBC连接上的Hibernate - Hibernate调用close()释放。未提交的事务会发生什么?

这个问题的答案是,“视情况而定!”当在连接上调用close()时,JDBC规范没有提到挂起的事务。发生什么取决于供应商如何实现规范。例如,对于Oracle JDBC驱动程序,对close()的调用提交了事务!大多数其他JDBC供应商采用相同的路由,并在JDBC连接对象关闭并将资源返回到池时回滚任何挂起的事务。很明显,这不会是选择的问题.

让我们扩展上面的例子来引发一个可能的问题。

代码语言:javascript
复制
Session session = sessionFactory.openSession();
Item item = session.get(Item.class, 123l);
item.setPrice(10);
session.close();

现在,它取决于JDBC驱动程序是否保留了Item的新价格。

因此,您可以忽略在纯SELECT操作上开始和提交事务,即使您的JDBC驱动程序将回滚事务,只要您没有数据库更改。

但无论如何,我强烈建议在任何操作中使用交易,以避免误解和问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38878550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档