事务在Hibernate中是可选的。但为什么我们每次都需要使用它?还有其他选择吗?

时间:2016-10-22 11:57:04

标签: java hibernate

我发现使用事务是可选的,因为hibernate应用程序在自己的应用程序代码中管理事务。但是当我尝试执行没有Transaction的代码时,代码执行时没有任何错误,但数据库中没有数据。如何在不使用Transaction的情况下提交数据(因为它是可选的)?交易的替代方案是什么?

 Configuration c = new Configuration();
 c.configure("hibernate.cfg.xml");
 SessionFactory sf = c.buildSessionFactory();

 Session s = sf.openSession();

 //Transaction t = s.beginTransaction();
 //some code
 //t.commit();

2 个答案:

答案 0 :(得分:2)

  

数据库或系统,事务边界始终是必需的。在数据库事务之外不会发生与数据库的通信(这似乎使许多习惯于自动提交模式的开发人员感到困惑)。始终使用明确的事务边界,即使是只读操作(c)Hibernate transaction demarcation doc

有些文档说交易是可选的。

  

(可选)应用程序用于指定原子工作单元的单线程,短期对象。它从底层的JDBC,JTA或CORBA事务中抽象出应用程序。在某些情况下,org.hibernate.Session可能会跨越几个org.hibernate.Transactions。但是,使用底层API或org.hibernate.Transaction的事务划分永远不是可选的。 Basic API's / architecture doc

实际上意味着如果你在一个为你做事务划分的环境(容器/框架)中运行你的代码 - 你可以跳过使用Hibernate API来实现这个。< / p>

此API的替代方法是Spring Declarative Transaction management(基本上是注释,它们也有XML方式),Transaction demarcation in an EJB container等 - 这取决于您运行代码的位置。

事务是数据库的基本工作单元,它们是工作数据库所必需的,使用数据库的人应该始终指定事务的开始/结束位置。

您可以在ACID guarantees上阅读更多内容。

答案 1 :(得分:1)

来自docs

public interface Transaction

允许应用程序定义工作单元,同时保持对底层事务实现的抽象(例如,JTA,JDBC)。

事务与会话关联,并且通常通过调用Session.beginTransaction()来实例化。单个会话可能跨越多个事务,因为会话的概念(应用程序和数据存储之间的对话)的粒度比事务的概念更粗略。 但是,任何时候最多只能有一个与特定会话相关联的未提交的交易。

因此很明显,如果没有Transaction

,您就无法进行任何交易