gpt4 book ai didi

java - Spring Data Jpa - ManyToMany - 删除连接表的实体

转载 作者:搜寻专家 更新时间:2023-10-31 19:59:44 25 4
gpt4 key购买 nike

我有这两个类:

public class ClassA extends [...] implements [...] {
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = JOIN_TABLE_NAME,
joinColumns = @JoinColumn(name = COLUMN_REF_A, referencedColumnName = COLUMN_ID_A),
inverseJoinColumns = @JoinColumn(name = COLUMN_REF_B, referencedColumnName = COLUMN_ID_B))
private List<ClassB> fieldClassB;
}

public class ClassB extends [...] implements [...] {
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "fieldClassB", cascade = CascadeType.ALL)
private List<ClassA> fieldClassA;

}

当我删除 ClassB(通过 spring data jpa 存储库)时,Hibernate 也会删除 ClassA 的实例,而我只想要 JOIN_TABLE_NAME< 中的行 表被删除(另一个问题是,由于级联模式,删除 ClassA 实体也会删除这些 ClassA< 引用的其他 ClassB/)。

有没有什么办法可以解决这个问题,而不必创建连接实体并将 @ManyToMany 注释替换为 @OneToMany 引用新的连接实体?

最佳答案

Cascade Remove 在 manyToMany 中不仅应用于链接表,还应用于关联的另一端。

所以 Cascade.ALL 也继承了 remove 在 manyToMany 上几乎总是一件坏事,因为它最终不仅从关联表中删除了东西。

你想要的是在你的实体中添加和删除方法来完成工作并保持两个列表同步:

public class ClassA extends [...] implements [...] {
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
@JoinTable(name = JOIN_TABLE_NAME,
joinColumns = @JoinColumn(name = COLUMN_REF_A, referencedColumnName = COLUMN_ID_A),
inverseJoinColumns = @JoinColumn(name = COLUMN_REF_B, referencedColumnName = COLUMN_ID_B))
private List<ClassB> fieldClassB;

public void addClassB(ClassB b) {
fieldClassB.add(b);
b.fieldClassA().add(this);
}

public void removeClassB(ClassB b) {
fieldClassB.remove(b);
b.fieldClassA().remove(this);
}
}

关于java - Spring Data Jpa - ManyToMany - 删除连接表的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48419158/

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