JPA + EJB:使用本机查询的事务

JPA + EJB: Transactions with Native Queries

我在无状态 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 配置(数据源)中将其标记为 JTA。