在Java,JPA中无法执行DELETE

use*_*208 0 java sql jpa

我有以下代码.问题是在第二行我得到"org.apache.openjpa.persistence.TransactionRequiredException:只能在事务处于活动状态时执行操作"

第一行执行得很好.我的错是什么?

//em is some EntityManager
String s = (String)em.createQuery("SELECT something FROM something WHERE something = something").getSingleResult();

em.createQuery("DELETE FROM something WHERE something = something").executeUpdate();
Run Code Online (Sandbox Code Playgroud)

Per*_*ion 5

读操作的处理方式与JPA中的写操作不同.写操作(无论是创建,更新还是删除)通常需要在事务的上下文中进行.事务边界划分您对会话或实体管理器的调用,并定义何时提交事务(例如,当使用容器管理的事务时,它可以在方法调用exit上调用commit ).

对于JPA,所有持久,删除,刷新和合并的调用都需要在事务中完成.如果调用它们,则需要在事务中执行查询调用executeUpdate.如果没有锁定模式,则调用getResultList()getUniqueResult()需要在事务的上下文中完成LockMode.NONE.

根据您的应用程序需求,您将使用容器管理事务(CMT)Bean管理事务(BMT).

对于CMT,请确保您的持久性单元将您的数据源定义为JTA,然后适当地注释您的类或方法.例如:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">
   <persistence-unit name="sample" transaction-type="JTA">
      <jta-data-source>java:/DefaultDS</jta-data-source>
      <properties>
         <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
         <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
      </properties>
   </persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)

然后使用适当的事务类型注释您的类/方法:

@ TransactionAttribute(TransactionAttributeType.REQUIRED)
public void doSomething() {
    em.createQuery("DELETE FROM something WHERE something = something").executeUpdate();
}
Run Code Online (Sandbox Code Playgroud)

如果使用BMT,则必须明确管理事务:

public void doSomething() throws Exception {
    em.getTransaction().begin();

    try {
        em.createQuery("DELETE FROM something WHERE something = something").executeUpdate();
    } catch(Exception e) {
        em.getTransaction().setRollbackOnly();
    } finally {
        em.getTransaction().commit();
    }
}
Run Code Online (Sandbox Code Playgroud)