[英]Use JTA transaction with EJB and JPA
各位大家好,我正在尋找下一個問題的一些幫助:我有一個jpa /無狀態ejb的proyect工作完美,它只是做簡單的查詢和持久化操作,但現在我需要執行一組持久操作,如果有的話他們失敗了,我必須執行回滾,所以我發現JTA可以完成這項工作,但使用這段源代碼:
@Stateless
public class ProjectBean implements IProject {
@Resource
javax.transaction.UserTransaction utx;
@PersistenceContext(unitName = "JPADB")
private EntityManager entityManager;
...
//more code
//this is part of a method
try{
utx.begin();
entityManager.joinTransaction();
for(Project p:projectResultList){
entityManager.persist(p);
}
utx.commit();
}catch(Exception e){
e.printStackTrace();
if(utx != null)
try {
utx.rollback();
} catch (IllegalStateException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (SecurityException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (SystemException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//tx.rollback();
}
根本不起作用,這就是persistence.xml的樣子:
<persistence-unit name="JPADB">
<jta-data-source>java:jboss/datasources/OracleBic</jta-data-source>
<properties>
<property name="hibernate.show_sql" value ="true" />
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
</properties>
</persistence-unit>
真的希望任何人都可以給我一個提示或建議,我是一個jpa / jta概念的新手,我嘗試了很多我在網上找到的代碼,但我總是得到不同的錯誤(錯誤的線程上的tx:預期TransactionImple usertransaction開始,不能在使用JTA時使用EntityTransaction)。 提前致謝。
您是否指示您的AS將在方法級別使用@TransactionManagement(TransactionManagementType.BEAN)手動處理事務? 我沒有看到類級別的注釋。 可能你在方法級別上有它,但你的代碼剪斷不足以做出任何猜測。 否則,所有事務都是容器管理的,並且您的代碼不起作用。 因此,您必須在方法或類級別上放置@TransactionManagement(TransactionManagementType.BEAN)取決於要求,或者您可能希望允許容器為您管理事務,而您必須進行@remigio向您建議的更改。 在您的情況下,第二種方法似乎更好
remigio的評論是正確的,@ Stateless會話bean用javax.ejb控制事務邊界。@ TransactionAttribute,如果缺少注釋,則所有公共方法都是TransactionAttribute.REQUIRED。 有關更多信息,請參閱http://download.oracle.com/otndocs/jcp/ejb-3_0-fr-eval-oth-JSpec/(ejb-3_0-fr- spec-ejbcore.pdf)。
UserTransaction從不在@Stateless會話bean中使用,而是由調用bean的客戶端用來划分比僅僅方法調用本身更寬的事務窗口。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.