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

标签 java spring-boot transactions modelmapper

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

我对解决方法很满意,但想了解原因。

谢谢

最佳答案

您标记为“工作”的代码导致假设货车 - 火车关系为 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 entity lifecycle 。最后,Train (wagon.getTrain()) 引用传递给 modelmapper。由于我的答案开头表达的假设,在删除货车之前,火车已从数据库加载。要删除货车,您还应该尝试将其从火车货车列表中删除。

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

关于java - 如果是 @Transactional,则删除方法不会影响数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56826320/

相关文章:

java - 如何在 JPA 2.1 中映射来自 NameStoredProcedure 的非实体结果集?

logging - Spring Boot linux 服务不轮换日志文件

java - sec :authorize does not work - Spring Boot 2, Thymeleaf 3、Thymeleaf Spring Security 5 集成包

java - Spring 组件的功能切换

Python 和 Postgres : would psycopg2. 连接锁定表?

java - 在 Eclipse 中自动添加适当的异常处理

java - 表格宽度太大

java - JPA 在一个项目中插入触发器之前执行,并在另一个项目中具有不同的行为

PHP PDO - 没有事件事务

sql - 数据库事务——或者这是一个规范化问题?