我有一个简单的方法从数据库中删除条目。在我添加了@Transactional注释之前,它一直工作得很好。在这种情况下,会像往常一样结束,但不会删除对象。
如果我删除@Transactional注释或ModelMapper,它将按预期的方式工作。(http://modelmapper.org/)。我没有看到任何抛出的异常可以解释回滚给我
请原谅我忽略了代码中的一些最佳实践。我只是
这是不工作的,不会影响数据库。
@Transactional
public JsonTrain delete(Long id) {
Wagon wagon = wagonRepository.getOne(id);
isSafeForDelete(wagon);
wagonRepository.delete(wagon);
return modelMapper.map(wagon.getTrain(), JsonTrain.class);
}这是行之有效的:
public JsonTrain delete(Long id) {
Wagon wagon = wagonRepository.getOne(id);
isSafeForDelete(wagon);
wagonRepository.delete(wagon);
return modelMapper.map(wagon.getTrain(), JsonTrain.class);
}这起作用了
@Transactional
public void delete(Long id) {
Wagon wagon = wagonRepository.getOne(id);
isSafeForDelete(wagon);
wagonRepository.delete(wagon);
}我对解决办法没有意见,但我想了解原因。
谢谢
发布于 2019-07-01 06:13:08
您标记为“工作”的代码导致了货车与列车之间的关系是fetch="EAGER"这一观点。
这个“不工作”和“一个事务”代码:
@Transactional
public JsonTrain delete(Long id) {
Wagon wagon = wagonRepository.getOne(id);
isSafeForDelete(wagon);
wagonRepository.delete(wagon);
return modelMapper.map(wagon.getTrain(), JsonTrain.class);
}首先从存储库(Wagon wagon = wagonRepository.getOne(id))加载一辆马车,然后将其标记为已删除(wagonRepository.delete(wagon)),请参阅:JPA实体生命周期。最后,将列车(wagon.getTrain())引用传递给modelmapper。由于在我的回答开始时表达的劫持,火车在货车被移除之前从数据库中加载。要移除一辆马车,你也应该尝试将它从火车货车列表中删除。
标记为“工作”的代码具有语义,其中每个存储库操作都在单独的事务中执行(Wagon wagon = wagonRepository.getOne(id)和wagonRepository.delete(wagon))。因此,当您将列车传递到modelmapper时,马车已经从数据库中删除--但是--因为带有列车的货车是在删除之前装载的,所以删除的旅行车也应该映射到JsonTrain (假设JsonTran有JsonWagon list :)。
https://stackoverflow.com/questions/56826320
复制相似问题