休眠奇怪的行为。多对多。级联ALL删除

问题描述:

我有以下型号:休眠奇怪的行为。多对多。级联ALL删除

图库照片关键字
|
关键字

@Entity 
@Table(name = "galleries") 
public class Gallery extends BaseModel{  

    @OneToMany(cascade = PERSIST, mappedBy = "mainGallery", orphanRemoval = true) 
    public List<Photo> photos; 

    @ManyToMany(fetch = LAZY, cascade = ALL) 
    @JoinTable(name="gallery_keywords", joinColumns= {@JoinColumn(name="gallery_id")}, inverseJoinColumns={@JoinColumn(name="keyword_id")}) 
    public List<Keyword> keywords = new ArrayList<>(); 


@Entity 
@Table(name = "photos") 
public class Photo extends BaseModel{ 

    @ManyToOne(fetch = LAZY, cascade = PERSIST) public Gallery mainGallery; 

    @ManyToMany(fetch = LAZY, cascade = ALL) 
    @JoinTable(name="photo_keywords", joinColumns= {@JoinColumn(name="photo_id")}, inverseJoinColumns={@JoinColumn(name="keyword_id")}) 
    public List<Keyword> keywords = new ArrayList<>(); 

@Entity 
@Table(name = "keywords") 
public class Keyword extends BaseModel { 

    @ManyToMany(fetch = LAZY) 
    @JoinTable(name="photo_keywords", joinColumns={@JoinColumn(name="keyword_id")}, inverseJoinColumns={@JoinColumn(name="photo_id")}) 
    public List<Photo> photos = new ArrayList<>(); 

    @ManyToMany(fetch = LAZY) 
    @JoinTable(name="gallery_keywords", joinColumns={@JoinColumn(name="keyword_id")}, inverseJoinColumns={@JoinColumn(name="gallery_id")}) 
    public List<Gallery> galleries = new ArrayList<>(); 

问题:我有照片的缺失问题。
如果任何属于此照片的关键字未出现在此图库的任何其他照片中,它将从数据库中删除,尽管它在photo_keywords表中包含记录并且属于其他图库中的其他照片。

但是,如果关键字属于这个画廊的其他照片,它不会被删除。

删除代码:

public void delete(Photo photo) { 
    photo.mainGallery.photos.remove(photo); 
    photo.delete(); 
} 

删除级联=从关键字字段批注照片类的所有解决它。但仍然是为什么?

+2

你的ManyToMany映射是错误的:其中一方必须是反面,使用mappedBy关键字。而级联= ALL并没有意义上的ManyToMany。如果你删除了一个关键字为“foo”的照片,你不想删除foo,因为其他照片也可能具有相同的关键字foo(更不用说其他画廊了)。 –

Thnx to @JB Nizet。

问题在于双方都拥有反向注释。这就是级联被忽略的原因。 但在文档中,据说双向关联有一个拥有方和一个逆(mappedBy)方。 这就是为什么行为是不可预测的。 从关键词不必要的注释中取出后:

@JoinTable(name="photo_keywords", joinColumns={@JoinColumn(name="keyword_id")}, inverseJoinColumns={@JoinColumn(name="photo_id")}) 

并补充说:mappedBy = "keywords" 我开始合理的例外: org.hibernate.exception.ConstraintViolationException: could not execute statement 所以我代替级联= ALL与级联= {持续,MERGE}

而且它是它。