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;
}
当我删除ClassB(通过spring数据jpa存储库)时,Hibernate也会删除的实例ClassA,而我只希望JOIN_TABLE_NAME删除表中的行(另一个问题是,由于级联模式,删除ClassA实体还会删除其他ClassB引用的对象通过这些ClassA)。
有什么方法可以解决这个问题,而不必创建连接实体并@ManyToMany通过@OneToMany引用新的连接实体来替换注释?
级联删除在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);
    }  
}
| 归档时间: | 
 | 
| 查看次数: | 4795 次 | 
| 最近记录: |