与EJB和JPA一起使用JTA事务

时间:2012-11-13 23:06:32

标签: jpa transactions ejb rollback jta

大家好,我正在寻找下一个问题的帮助: 我有一个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)。提前谢谢。

2 个答案:

答案 0 :(得分:2)

您是否指示您的AS将要手动处理交易 方法级别的@TransactionManagement(TransactionManagementType.BEAN)?我没有看到类级别的注释。可能你在方法级别上有它,但你的代码剪断不足以做出任何猜测。 否则,所有事务都是容器管理的,并且您的代码不起作用。所以你必须要么 @TransactionManagement(TransactionManagementType.BEAN) 方法或类级别取决于要求,或者您可能希望允许容器为您管理事务,而您必须进行@remigio向您建议的更改。 似乎第二种方法在你的情况下更好

答案 1 :(得分:0)

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的客户端用来划分比仅仅方法调用本身更宽的事务窗口。