Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA-如何删除失败的“;“命令”;来自entitymanager_Java_Jpa_Rollback - Fatal编程技术网

Java JPA-如何删除失败的“;“命令”;来自entitymanager

Java JPA-如何删除失败的“;“命令”;来自entitymanager,java,jpa,rollback,Java,Jpa,Rollback,我有一张装满书的桌子。每本书都有数量。该表有一个限制,不允许金额变成问题是,在您的事务中,您有一个操作失败,而其他操作没有失败(不清楚还有哪些其他操作正在尝试提交,因为我们看不到在事务之前执行了哪些其他代码)。使用JPA,您无法访问JPA将执行的操作列表,而是通过在不同事务中执行不同的操作来控制提交的内容。因此,您可以做的只是尝试在不同的事务中执行EntityManager.merge()(在该事务之前,创建一个新的EntityManager或调用EntityManager.clear()) 还

我有一张装满书的桌子。每本书都有数量。该表有一个限制,不允许金额变成问题是,在您的事务中,您有一个操作失败,而其他操作没有失败(不清楚还有哪些其他操作正在尝试提交,因为我们看不到在事务之前执行了哪些其他代码)。使用JPA,您无法访问JPA将执行的操作列表,而是通过在不同事务中执行不同的操作来控制提交的内容。因此,您可以做的只是尝试在不同的事务中执行
EntityManager.merge()
(在该事务之前,创建一个新的
EntityManager
或调用
EntityManager.clear()

还要注意的是,强烈建议(至少在Hibernate中)抛出/垃圾收集抛出异常的
EntityManager
,因此不要在该异常之后重用它


PS:如我所见,您使用事务类型为
RESOURCE\u LOCAL

的EntityManager,这可能不起作用,因为(取决于您的环境/托管事务/手动事务)事务标记为
isRollbackOnly()
,您将不再完成事务。这是一个bug吗?事务已在catch子句中关闭。而且这些变化没有提交。所以我猜当出现错误时,它进行了回滚,然后关闭事务,然后抛出它。我的合并正在更新方法中运行。它类似于public void updateBook(Book b){b.setAmount(…);transaction.begin();entitymanager.merge(b);transaction.commit()},因此每个合并都有一个事务。但如果一次更新失败,所有后续操作都将失败,原因是约束siad“no,you dont”,因为失败的命令将在每次提交时执行。我需要删除它,因为在不同事务中重复使用相同的
EntityManager
实例是不好的,因为在一个异常失败后,它可能会保持不一致的状态。你是使用hibernate还是EclipseLink?然后阅读。这意味着,在抛出异常后,必须关闭entityManager并将其丢弃。如果您需要一些其他的DB操作,那么只需创建一个新的
EntityManager
,从性能角度来看,这是非常便宜的。
book.setAmount(book.getAmount()-1);
EntityTransaction transaction = this.entityManager.getTransaction();
transaction.begin();
try{
 this.entityManager.merge(book);
 transaction.commit();
catch(RollbackException re){
 // TODO: remove the failed statemeant somehow
}