3

大家好,我正在寻找下一个问题的帮助:我有一个运行良好的 jpa/无状态 ejb 项目,它只是执行简单的查询和持久化操作,但现在我需要执行一组持久化操作,如果有的话他们失败了,我必须执行回滚,所以我发现 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)。提前致谢。

4

2 回答 2

2

您是否指示您的 AS 将在方法级别使用 @TransactionManagement(TransactionManagementType.BEAN) 手动处理事务?我没有看到班级级别的注释。可能您在方法级别上有它,但是您的代码被剪断不足以做出任何猜测。否则所有事务都由容器管理,您的代码将无法正常工作。因此,您必须根据要求将 @TransactionManagement(TransactionManagementType.BEAN) 放在方法或类级别上,或者您可能希望允许容器为您管理事务,而不是您必须进行 @remigio 建议的更改。在您的情况下,第二种方法似乎更好

于 2012-11-14T18:20:39.613 回答
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 的客户端使用,以划分比方法调用本身更宽的事务窗口。

于 2012-11-14T15:05:17.157 回答