簡體   English   中英

與EJB和JPA一起使用JTA事務

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM