2012-09-11 83 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> 
相關問題