2011-09-30 96 views
14

這是一個學術問題;與此相關,我沒有破碎的代碼。我只是想擴大我對引擎蓋下發生的事情的理解。UserTransaction和EntityManager如何交互?

我一直在使用的代碼模式在我的JPA DAO我典型的JSF Web應用程序(從書籍和教程複製)基本上是這樣的:

public class someDAO { 

    @PersistenceContext protected EntityManager em; 
    @Resource   private UserTransaction utx;  

    public void persist(Entity entity) { 
     try { 
      utx.begin(); 
      em.persist(entity); 
      utx.commit(); 
     } catch (// gawd awful long list of possible exceptions) 

     // etc 

所以我的問題如下:

  1. 爲什麼EntityManager實例和UserTransaction實例注入了兩個看似無關的包的註釋?

  2. 爲什麼使用註釋@Resource和@PersistenceContext而不是@ManagedProperty或@Inject?

  3. 怎樣的堅持()方法訪問,並與UTX對象進行交互?如果我忘記utx.begin()調用實體管理器知道它並拋出和異常。它必須以某種神奇的方式找到UserTransaction對象。定義界面是不是更好的體系結構:em.persist(utx,entity)

  4. 如果UTX是某種單的 - 這可能有一個以上的UserTransaction一次打開?

許多感謝您的任何討論。

+0

你認爲EJB嗎? EJB使用容器管理的事務。這樣您就不必擔心自己管理事務(並且它使您的服務方法免受嘗試時的混亂)。 – BalusC

+0

我的代碼模式是從像Burns JSF 2這樣的書中學來的。我不介意這種代碼模式,因爲我設法將它全部限制在一個抽象的DAO對象中。我所有具體的DAO都從這個對象延伸出來,所以這個垃圾(如果這個詞適用)其中的一部分幾乎是看不見的。但不是沒有想到。 – AlanObject

回答

11
  1. 由於UserTransaction是Java Transaction API(JTA)的一部分,EntityManager是Java Persistence API(JPA)的一部分。 JTA不是JPA的一部分。 JPA使用JTA提供的服務。

  2. 是不是ManagedProperty是一些註釋,只有在用@ManagedBean註釋的類中才有效。也許最好不要在託管bean中注入UserTransaction 不同的方式。

  3. 活動事務的JNDI查找。保留名稱似乎是java:comp/UserTransaction。一個實現:http://www.java2s.com/Open-Source/Java-Document/Database-ORM/hibernate/org/hibernate/transaction/JTATransactionFactory.java.htm

  4. 這不是某種單身,你可以有多個。但是每個線程只能有一個活動。