【发布时间】:2021-04-19 00:49:17
【问题描述】:
我的 Spring Data JPA 存储库有一个我不理解的问题。我有以下实体:
@Entity
public class Ability {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String name;
private String color;
private String image;
@ManyToOne(
fetch = FetchType.EAGER
)
private Subject subject;
@OneToMany(
mappedBy = "ability",
cascade = CascadeType.ALL,
orphanRemoval = true,
fetch = FetchType.EAGER
)
private Set<Technology> technologies;
以及该实体的 JPA 存储库。
我不明白的是,当我使用我的 Jpa Repository 的 deleteById 方法时,记录并没有从数据库中删除。奇怪的是,它在我使用 InMemory 数据库的集成测试中运行良好。
如果我用以下内容覆盖deleteById,它会起作用:
@Modifying
@Query("DELETE FROM Ability a WHERE a.id = :id")
void deleteById(@Param("id") Integer id);
但我怀疑我不应该这样做。该方法的任何线索都无法按预期工作?
编辑:添加端点源代码
@RestController
@RequestMapping("/subjects/{subjectId}/abilities")
public class AbilityController {
...
private final AbilityRepository abilityRepository;
private final TechnologyRepository technologyRepository;
private final SubjectRepository subjectRepository;
public AbilityController(AbilityRepository abilityRepository, TechnologyRepository technologyRepository, SubjectRepository subjectRepository) {
this.abilityRepository = abilityRepository;
this.technologyRepository = technologyRepository;
this.subjectRepository = subjectRepository;
}
@DeleteMapping("{abilityId}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void deleteAbility(@PathVariable("subjectId") Integer subjectId, @PathVariable("abilityId") Integer abilityId) {
if (!abilityRepository.existsAbilityBySubjectId(subjectId, abilityId)) {
throw new ResourceNotFoundException(String.format("No ability with Id : %s", abilityId));
}
abilityRepository.deleteById(abilityId);
}
...
}
编辑:添加休眠 SQL
Hibernate:
select
ability0_.id as id1_0_0_,
ability0_.color as color2_0_0_,
ability0_.image as image3_0_0_,
ability0_.name as name4_0_0_,
ability0_.subject_id as subject_5_0_0_,
subject1_.id as id1_7_1_,
subject1_.icon as icon2_7_1_,
subject1_.image as image3_7_1_,
subject1_.name as name4_7_1_,
technologi2_.ability_id as ability_4_8_2_,
technologi2_.id as id1_8_2_,
technologi2_.id as id1_8_3_,
technologi2_.ability_id as ability_4_8_3_,
technologi2_.image as image2_8_3_,
technologi2_.name as name3_8_3_
from
ability ability0_
left outer join
subject subject1_
on ability0_.subject_id=subject1_.id
left outer join
technology technologi2_
on ability0_.id=technologi2_.ability_id
where
ability0_.id=?
Hibernate:
select
abilities0_.subject_id as subject_5_0_0_,
abilities0_.id as id1_0_0_,
abilities0_.id as id1_0_1_,
abilities0_.color as color2_0_1_,
abilities0_.image as image3_0_1_,
abilities0_.name as name4_0_1_,
abilities0_.subject_id as subject_5_0_1_
from
ability abilities0_
where
abilities0_.subject_id=?
Hibernate:
select
technologi0_.ability_id as ability_4_8_0_,
technologi0_.id as id1_8_0_,
technologi0_.id as id1_8_1_,
technologi0_.ability_id as ability_4_8_1_,
technologi0_.image as image2_8_1_,
technologi0_.name as name3_8_1_
from
technology technologi0_
where
technologi0_.ability_id=?
提前致谢
【问题讨论】:
-
所以,只是为了确保:您运行生产代码,等待事务提交,然后检查该实体是否没有从数据存储中删除?
-
可能某些外键约束失败并且没有完成。检查您的应用程序的日志
-
@crizzis 是的。我假设当 HTTP 请求被解析时,事务已经被提交。
-
@Boug 我的日志中没有错误。实际上我记录了 Hibernate 的 SQL 并且没有执行“DELETE”命令
-
我刚刚做了,它们是正确的,并且与我在数据库中的内容相对应
标签: java spring spring-boot jpa spring-data-jpa