gpt4 book ai didi

java - Spring JPA 存储库删除方法不起作用

转载 作者:行者123 更新时间:2023-12-05 08:20:03 26 4
gpt4 key购买 nike

我无法让 Spring JPA 使用 jpa 存储库删除方法删除 bar 实体。
谁能看出问题出在哪里?

不起作用:

barRepository.delete(bar.id);

Jpa 存储库:

public interface BarRepository extends JpaRepository<Bar, Integer>

Hibernate 实体映射(仅相关部分):

@Entity(name = "foo")

@OneToMany(fetch = FetchType.EAGER, mappedBy = "foo", cascade = CascadeType.ALL, orphanRemoval = true)
@Fetch(FetchMode.SELECT)
private List<Bar> bars = new ArrayList<>();

@Entity(name = "bar")

@ManyToOne(optional = false)
@JoinColumn(name = "foo_id")
@Fetch(FetchMode.SELECT)
private Foo foo;

编辑:带有最少可重现示例的 git repo。HibernateDeleteApplicationTests.java 包含测试用例。

https://github.com/matijaivanus/hibernate-delete-problem

最佳答案

“问题”是您的映射。急切地检索您的 Collection 。现在为什么会成为一个问题。 Spring Data JPA 中的 deleteById 首先执行 findById ,在您的情况下,它会加载 BarFoo 并且急切地Foo 中的集合。

现在尝试删除 Bar,但由于它仍然被另一个实体附加和引用,它将再次持久化,因此删除被取消。

要解决你有 3 个选项

  1. 使用查询删除并为此编写自己的查询方法
  2. Foo中正确删除Bar,将关系设置为null,然后保留Foo或删除
  3. 将关联的任一侧标记为懒惰(这仍然可能由于 1 而失败)。

这些都可以。第一个是因为它绕过了 JPA 缓存机制,第二个是因为现在关联已被切断。第三个可以工作,但如果对象已经加载,则会遇到与 1 相同的问题。

关于java - Spring JPA 存储库删除方法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63030917/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com