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
Jpa 不存在实体的spring数据删除产生;标记为“回滚”的事务处理;_Jpa_Transactions_Spring Data_Spring Data Jpa - Fatal编程技术网

Jpa 不存在实体的spring数据删除产生;标记为“回滚”的事务处理;

Jpa 不存在实体的spring数据删除产生;标记为“回滚”的事务处理;,jpa,transactions,spring-data,spring-data-jpa,Jpa,Transactions,Spring Data,Spring Data Jpa,这个问题似乎已经被问过很多次了——但也许不是那么简单,而且目前的答案似乎都不适合我 我有一个非常简单的基于web的spring boot应用程序,带有REST控制器: @RequestMapping(value = "/{id}", method = RequestMethod.DELETE) @ResponseStatus(HttpStatus.OK) public void delete(@PathVariable("id") String id) { boolean success

这个问题似乎已经被问过很多次了——但也许不是那么简单,而且目前的答案似乎都不适合我

我有一个非常简单的基于web的spring boot应用程序,带有REST控制器:

@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
@ResponseStatus(HttpStatus.OK)
public void delete(@PathVariable("id") String id) {
    boolean success = customerService.delete(id);
    if (!success) {
        throw new ResourceNotFoundException();
    }
}
我有一个带有标记为事务性的delete方法的服务:

@Override
@Transactional
public boolean delete(String id) {
    try {
        customerRepository.delete(id);
    } catch (EmptyResultDataAccessException e) {
        return false;
    }
    return true;
}
我正在捕获异常,因为如果删除对象是不存在的实体,我不希望我的服务实现在删除时抛出异常。从JpaRepository so派生的customerRepository id是为我自动生成的

如果我尝试删除一个现有的实体-一切都很好。如果我尝试删除一个不存在的实体,则会抛出并捕获EmptyResultDataAccessException,返回值false,然后当方法结束并提交事务时,我会得到
javax.persistence.RollbackException:标记为rollbackOnly的事务


我理解(或认为我确实理解)正在发生的事情,只是不知道如何去阻止它。我曾尝试在我的事务注释中添加各种NorollBackbor组合,但没有效果

您需要该方法中的事务处理吗?Delete方法已具有事务。另一个解决方法(我认为在这种情况下更好)是检查实体是否存在,然后使用
delete(entity)
方法将其删除。您使用的是哪个版本的Spring和Spring数据JPA?我在最新版本中没有发现任何错误。测试时,Github上提供了。@manish spring 4.3.6和spring data jpa 1.11.0通过spring boot 1.5.1提供-RELEASE@ByeBye我在删除之前确实进行了最初的加载和检查(存储库impl就是这样做的)但是它感觉不对——我担心即使在初始检查之后,异常仍然会被抛出——但是考虑到工作单元与线程和事务绑定,它可能不能这样做,所以这可能是最好的方法。从服务中删除事务边界并依赖于回购协议上的事务边界也可以很好地工作。您需要使用该方法进行事务处理吗?Delete方法已具有事务。另一个解决方法(我认为在这种情况下更好)是检查实体是否存在,然后使用
delete(entity)
方法将其删除。您使用的是哪个版本的Spring和Spring数据JPA?我在最新版本中没有发现任何错误。测试时,Github上提供了。@manish spring 4.3.6和spring data jpa 1.11.0通过spring boot 1.5.1提供-RELEASE@ByeBye我在删除之前确实进行了最初的加载和检查(存储库impl就是这样做的)但是它感觉不对——我担心即使在初始检查之后,异常仍然会被抛出——但是考虑到工作单元与线程和事务绑定,它可能不能这样做,所以这可能是最好的方法。从服务中移除交易边界并依赖回购协议上的交易边界也可以很好地工作。