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

Delete method is not affecting the database if it's @Transactional

我有这个简单的方法可以从数据库中删除条目。 在我添加 @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);
}

我接受解决方法,但想了解原因。

谢谢

您标记为 "working" 的代码导致 Wagon - Train 关系为 fetch="EAGER"

的假设

此"not working"和"one transaction"代码:

@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 entity lifecycle。最后将 Train (wagon.getTrain()) 引用传递给 modelmapper。由于我在回答开头表达的假设,火车是在 Wagon 被移除之前从数据库中加载的。要删除货车,您还应该尝试将其从火车货车列表中删除。

您标记为 "working" 的代码具有语义,其中每个存储库操作都在单独的事务中执行(Wagon wagon = wagonRepository.getOne(id)wagonRepository.delete(wagon))。因此,当您将火车传递给 modelmapper 时,货车已经从数据库中删除 - 但是 - 因为在删除之前装载了带火车的货车,所以删除的货车也应该映射到 JsonTrain(假设 JsonTran 有 JsonWagon 列表 :))。