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。
我在无状态 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。