如何在JPA中自动提交SQL Server事务?

时间:2012-09-11 03:54:41

标签: sql-server hibernate jpa

为什么我需要使用事务来持久保存实体?我可以添加到persistence.xml中以自动提交吗?

这不插入:

em.persist(this);

但这样做:

em.getTransaction().begin();
em.persist(this);
em.getTransaction().commit();

我猜我的初始参考点是this GWT doco

public void persist() 
{
   EntityManager em = entityManager();
   try 
   {
     em.persist(this);
   } 
   finally 
   {
     em.close();    
   }  
}

2 个答案:

答案 0 :(得分:1)

IMO在persistence.xml中没有这样的设置

我认为这种模式是从JDBC事务管理中采用的,您可以在连接上设置autocommit false,然后执行任意数量的查询。但除非您在连接上调用commit,否则不会提交事务。如果autocommit为false(默认值),那么每个执行的语句都是隐式提交的,如果我们有多个需要在原子操作中运行的语句,我们不希望这种情况发生。

以您的示例为例,当您持久保存对象时,该对象可能具有脏的关联,并且也需要持久化。因此,需要以原子方式运行多个sql。所以使用上面提到的交易管理策略。

实体管理器(在JPA中)和会话API(在Hibernate中)用于抽象数据库上的CRUD操作。对于实际提交生成的sql语句,事务API被设计为事务管理的抽象。我相信这种单独抽象的原因是事务通常有两种类型 - 资源本地事务和分布式事务。

事务管理基础结构需要以不同于分布式事务的方式处理资源本地事务。在资源本地事务中,发送到数据库的所有sql在连接上调用commit时由数据库提交,或者在连接上调用rollback时回滚。在分布式事务管理中,事务管理器组件是管理提交或回滚给所有参与者的信令的组件。

在JPA中,您可以将交易类型称为

<persistence-unit transaction-type="RESOURCE_LOCAL  or JTA">
 .................................
</persitence-unit>

答案 1 :(得分:1)

JPA没有定义这样的行为;任何“persist()”被定义为根据规范等待下一个事务。显然,JPA的某些实现(例如DataNucleus JPA)确实提供了(自动提交)工具,但它超出了JPA规范(不是其中的一部分)