繁体   English   中英

JPA + EJB:带有本地查询的事务

[英]JPA + EJB: Transactions with Native Queries

我在Stateless bean的JPA中使用本地查询管理事务时遇到问题。 我使用JBoss EAP 6.2和Oracle 11g数据库,而作为JPA框架,我使用Hibernate。 在JBoss下使用Oracle JDBC驱动程序配置数据源。 我有一种方法应该删除数据库中的某些内容,然后在同一事务中更新其他条目。 下面我放了简化的代码来做到这一点:

@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class MappingsDAO {

    @PersistenceContext
    protected transient EntityManager em;

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void updateMappings(int id, Set<String> ids) {
        Query query = em.createNativeQuery("DELETE FROM MAPPINGS M WHERE M.ID = :id");
        query.setParameter("id", id);
        query.executeUpdate();

        query = em.createNativeQuery("UPDATE MAPPINGS M SET M.ID = :id WHERE M.MAPID IN (:ids)");
        query.setParameter("id", id);
        query.setParameter("ids", ids);
        query.executeUpdate();
    }

}

当我执行此代码时,将执行删除查询,然后执行更新查询,这有意无法显示该事务无法正常运行,但在这种情况下回滚不起作用,因为删除操作未回滚。

我还尝试通过添加以下行来将FlushModeType更改为COMMIT:

em.setFlushMode(FlushModeType.COMMIT);

但这也没有任何效果。 我也尝试过使用BEAN管理的事务并手动管理事务,但效果相同。

有谁知道如何解决这个问题?

一个典型的问题是PersistenceUnit不是JTA。 您应该在persistence.xml文件和JBoss配置(DataSources)中都将其标记为JTA。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM