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

Tho*_*mas 5 java spring hibernate spring-data-jpa

我有这两节课:

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;

}
Run Code Online (Sandbox Code Playgroud)

当我删除ClassB(通过spring数据jpa存储库)时,Hibernate也会删除的实例ClassA,而我只希望JOIN_TABLE_NAME删除表中的行(另一个问题是,由于级联模式,删除ClassA实体还会删除其他ClassB引用的对象通过这些ClassA)。

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

Zer*_*mus 5

级联删除在manyToMany中不仅应用于链接表,而且还应用于关联的另一端。

因此,也继承了remove的Cascade.ALL几乎总是对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);
    }  
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢Zeromus。这实际上是我遗漏的一块拼图。我已经将删除操作绑定到一个用`@PreRemove`(在`ClassB` 中)注释的方法来自动处理操作。 (2认同)