java - JPA + EJB : Transactions with Native Queries

标签 java hibernate jpa jboss ejb-3.0

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

相关文章:

java - Spring Data JPA : query ManyToMany, 如何从映射的类获取数据?

mysql - 在jpa中运行sql脚本时sql语法错误

java - XStream useAttributeFor 不起作用

java - 在 JRuby 中抛出 Java 异常并在 Java 中捕获它

java - ** 在 web.xml 安全约束中不起作用

java - 无法检索亚马逊凭据

java - 使用 Spring Data Jpa 获取连接对象

java - OneToOne Lazy 总是获取子项

spring - 在spring + hibernate中保存creationTimestamp和updatedTime

hibernate - 使用 @NamedQuery 进行单列选择(J2EE/JPA、Hibernate)是一个好习惯吗?