2012-09-11 100 views
1

为什么我需要使用一个事务来坚持一个实体?有什么我可以添加到我的persistence.xml自动提交?如何在JPA中自动提交SQL Server事务?

这不插入:

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();  
    } 
} 

回答

1

JPA没有定义这种行为;任何“persist()”被定义为根据规范等待下一个事务。很显然,JPA的某些实现(如DataNucleus JPA)确实提供了(自动提交)功能,但它超出了JPA规范

+0

[链接](https://developers.google.com/web- toolkit/doc/latest/DevGuideRequestFactory)有一个不使用事务的例子...你为什么这么想? – upshake

+0

那是什么? Google AppEngine使用DataNucleus JPA,即提供自动提交模式的JPA实现(如我已经说过的) – DataNucleus

+0

非常好。谢谢。 – upshake

1

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

我认为这种模式是从JDBC事务管理中采用的,您可以在连接上设置自动提交false,然后执行任意数量的查询。但是,除非您调用连接提交,否则不会提交事务。如果autocommit为false(这是默认值),那么每个已执行的语句都是隐式提交的,如果我们有多个需要在原子操作中运行的语句,我们不希望发生这种情况。以您的示例为例,当您坚持对象时,该对象可能具有肮脏且需要保持的关联。所以会有多个需要以原子方式运行的sql。所以使用上述交易管理策略。

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

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

在JPA可以提交易类型为

<persistence-unit transaction-type="RESOURCE_LOCAL or JTA"> 
................................. 
</persitence-unit> 
相关问题