2013-05-13 90 views
1

我試圖集成Spring和JSF我堅持持久化對象。我不想處理事務(開始 - 提交等)JPA - 容器管理持久性不會堅持實體-JTA

經過一番google搜索我能找到一個答案給我所需要的in this link

我使用的EclipseLink作爲ORM和Oracle 11g數據庫和GlassFish應用服務器3.1使用Maven 。 我喜歡Spring配置的註釋。我使用

@Transactional 
@Service 

相關類中的註釋。 我的persistence.xml名稱是E_DefterManagementPU和我的交易類型是JTA。 這裏是我的代碼堅持efaFunctions

public EntityManager entityManager; 

@Inject 
public void setEntityManager() { 
    EntityManagerFactory emf = Persistence. 
      createEntityManagerFactory("E_DefterManagementPU"); 
    this.entityManager = emf.createEntityManager(); 
}  

public void create(EfaFunctions efaFunctions) {    
    entityManager.persist(efaFunctions); 
} 

實體管理器不爲空,我可以看到**分配序列對象**登錄GlassFish的,但也不會產生其他的他的日誌,但如果我寫的下面的代碼與不可見部分與aboe代碼塊相同;

public void create(EfaFunctions efaFunctions) {  
    entityManager.getTransaction().begin(); 
    entityManager.persist(efaFunctions); 
    entityManager.getTransaction().commit(); 
} 

它堅持對象。 這個工程,但我不想處理開始()提交()部分和相應的資源與JTA容器管理的持久性應該做到這一點,而不是我。任何機構可以告訴我我錯在哪裏謝謝

+0

你是否在EJB(企業Java Bean)的上下文中進行此操作?如果沒有,則不存在容器管理的事務,並且您必須在代碼中管理事務(這實際上並不那麼糟糕)。 – 2013-05-13 21:34:41

+0

感謝Bailey,實際上我不使用EJB我正在嘗試這個服務層的我的web項目。我的豆子在上面,他們是JSF ManagedBeans.Without EJB的任何知識,我希望我可以正確定義。 – Malcolmxappa 2013-05-13 21:39:56

+0

如果沒有容器管理員,春天如何處理交易而不管理它。對於我沒有受過教育的問題,我可以提供一個春天的項目,它的運行代碼如下: 'protected Class entityClass; @PersistenceContext protected EntityManager entityManager; @Override public T create(T t)this.entityManager.persist(t); return t; }' – Malcolmxappa 2013-05-13 21:45:36

回答

1

在JSF託管的豆有沒有隱式交易。避免手動管理事務的唯一方法是在應用程序服務器中創建一個EJB,並讓JSF託管bean調用它來保存數據。您正在使用GlassFish,因此使用EJB將是可能的......但這絕對是一個新的複雜程度。處理持久性交易的一個好方法是有這樣一個try-catch塊模板:

EntityManager em = ... //However you get an em. 
    try { 
     em.getTransaction().begin(); 

     // ... Put your persistence code here. 

     em.getTransaction().commit(); 
    } catch (Exception ex) { 
     em.getTransaction().rollback(); 
     throw ex; 
    }finally { 
     em.close(); 
    } 

這是不乾淨期待的超級光滑CDI和自動交易,但它一定會妥善處理交易,並確保數據的完整性。

+0

謝謝!我知道了,但我在我的項目中使用了一些Spring和一些JSF。 我引用了這個[教程](http://www.mkyong.com/jsf2/jsf-2-0-spring-integration-example/)。可以改變這種情況嗎?我可以使用這個結構嗎? – Malcolmxappa 2013-05-13 21:56:08

+0

try-catch-finally塊在任何具有「EntityManager」的編程環境中都可以工作。如果你正在使用Spring來注入'EntityManager',你可以放心地忽略'finally {em.close();}',因爲Spring會爲你做這件事。 – 2013-05-13 22:32:43

+0

我轉換使用JSF和EJB爲我的項目,它進展順利。 ContainerManagedPersistence使我的項目不需要+ Spring。 – Malcolmxappa 2013-05-15 12:01:11