我在无状态 bean 的 JPA 中使用 native 查询管理事务时遇到问题。我使用 JBoss EAP 6.2 和 Oracle 11g 数据库,并使用 Hibernate 作为 JPA 框架。数据源在 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。
关于java - JPA + EJB : Transactions with Native Queries,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28827689/