Hibernate用null更新子实体,而不是删除,如何强制它



我有一个播放列表实体,它拥有用CascadeType.All注释的剪辑集合。虽然事实上它是双向关系,但我将其定义为单向关系,以避免不必要的级联。所以剪辑具有playlistId整数属性,而不是对播放列表的引用。剪辑被定义为播放列表的一部分,因此没有它就不可能存在。因此DB中的"playlist_ID"列被定义为非null,getPlayListId()也被定义为。我读到,如果我从集合中移除项,级联会将其视为关系的移除,而不是实体的移除。在我的情况下,这是一个问题,因为cascade试图将Playlist_ID列设置为null并导致违反约束。

我想要代码:
播放列表.getClips().remove(0);dao更新(播放列表)
将删除剪辑。有什么办法吗?

您应该使用orphanRemoval:

@Entity
public class Playlist {
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
private List<Clip> clips;
}

如果使用inverse=true的旧HBM表示法,它将按照您希望的方式工作。如果您使用的是Hibernate Annotations,则表示inverse=true的新方法是在父端使用mappedBy

使用正确的映射将播放列表成员字段添加到剪辑对象。如果您的播放列表实体上有@JoinColumn注释,请将其注释掉,并在@OneToMany注释处添加mappedBy="whateverYourPlaylistVariableIsCalled" 的属性

这将告诉Hibernate不要更新,只在你破坏关系时删除。

最新更新