這是一個學術問題;與此相關,我沒有破碎的代碼。我只是想擴大我對引擎蓋下發生的事情的理解。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
所以我的問題如下:
爲什麼EntityManager實例和UserTransaction實例注入了兩個看似無關的包的註釋?
爲什麼使用註釋@Resource和@PersistenceContext而不是@ManagedProperty或@Inject?
怎樣的堅持()方法訪問,並與UTX對象進行交互?如果我忘記utx.begin()調用實體管理器知道它並拋出和異常。它必須以某種神奇的方式找到UserTransaction對象。定義界面是不是更好的體系結構:em.persist(utx,entity)?
如果UTX是某種單的 - 這可能有一個以上的UserTransaction一次打開?
許多感謝您的任何討論。
你認爲EJB嗎? EJB使用容器管理的事務。這樣您就不必擔心自己管理事務(並且它使您的服務方法免受嘗試時的混亂)。 – BalusC
我的代碼模式是從像Burns JSF 2這樣的書中學來的。我不介意這種代碼模式,因爲我設法將它全部限制在一個抽象的DAO對象中。我所有具體的DAO都從這個對象延伸出來,所以這個垃圾(如果這個詞適用)其中的一部分幾乎是看不見的。但不是沒有想到。 – AlanObject