我有以下代码.问题是在第二行我得到"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)
读操作的处理方式与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)
归档时间: |
|
查看次数: |
4541 次 |
最近记录: |