首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除方法不影响数据库,如果它是@Transactional的

删除方法不影响数据库,如果它是@Transactional的
EN

Stack Overflow用户
提问于 2019-06-30 16:14:10
回答 1查看 1.6K关注 0票数 1

我有一个简单的方法从数据库中删除条目。在我添加了@Transactional注释之前,它一直工作得很好。在这种情况下,会像往常一样结束,但不会删除对象。

如果我删除@Transactional注释或ModelMapper,它将按预期的方式工作。(http://modelmapper.org/)。我没有看到任何抛出的异常可以解释回滚给我

请原谅我忽略了代码中的一些最佳实践。我只是

这是不工作的,不会影响数据库。

代码语言:javascript
复制
@Transactional
public JsonTrain delete(Long id) {
   Wagon wagon = wagonRepository.getOne(id);
   isSafeForDelete(wagon);
   wagonRepository.delete(wagon);
   return modelMapper.map(wagon.getTrain(), JsonTrain.class);
}

这是行之有效的:

代码语言:javascript
复制
public JsonTrain delete(Long id) {
   Wagon wagon = wagonRepository.getOne(id);
   isSafeForDelete(wagon);
   wagonRepository.delete(wagon);
   return modelMapper.map(wagon.getTrain(), JsonTrain.class);
}

这起作用了

代码语言:javascript
复制
@Transactional
public void delete(Long id) {
   Wagon wagon = wagonRepository.getOne(id);
   isSafeForDelete(wagon);
   wagonRepository.delete(wagon);
}

我对解决办法没有意见,但我想了解原因。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-01 06:13:08

您标记为“工作”的代码导致了货车与列车之间的关系是fetch="EAGER"这一观点。

这个“不工作”和“一个事务”代码:

代码语言:javascript
复制
@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 :)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56826320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档