JPA - 如何删除失败的"命令"来自entitymanager

时间:2015-02-13 08:30:31

标签: java jpa rollback

我有一张装满书的桌子。每本书都有金额。该表具有约束,其不允许该量变为<0。如果我合并一个数量小于0的书,则提交将抛出RollbackException。这就是问题所在。据我所知的合并方法,它在后台生成sql,将其添加到列表中,每次提交时,entitymanager都会运行该列表并执行它可以找到的每个sql命令。
但是,想要将数量更新为小于0的命令仍然在此列表中,因为它无法执行。因此,每个后续提交都将失败,因为约束使一个命令失败。

如何从提交的catch子句中的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
}

谢谢,巴斯蒂

1 个答案:

答案 0 :(得分:0)

问题在于,在您的事务中,您的操作失败而其他操作失败(不清楚哪些其他操作正在尝试提交,因为我们在事务之前没有看到其他代码被执行)。使用JPA,您无权访问JPA将要执行的操作列表,而是通过在不同事务中执行不同的操作来控制所提交的内容。因此,您可以做的只是尝试在另一个事务中执行EntityManager.merge()(在该事务之前,创建新的EntityManager或调用EntityManager.clear())。

另外请注意,强烈建议(至少使用Hibernate)抛出/垃圾收集抛出异常的EntityManager,所以不要在异常之后重复使用它。

PS:如我所见,您使用的交易类型为RESOURCE_LOCAL的EntityManager。