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