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

时间:2012-03-08 14:20:16

标签: java hibernate annotations

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

我想要代码:
       playlist.getClips()除去(0)。 dao.update(播放列表)
将删除剪辑。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

你应该使用orphanRemoval:

@Entity
public class Playlist {

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
private List<Clip> clips;

}

答案 1 :(得分:1)

如果您使用inverse=true的旧HBM表示法,它将按您希望的方式工作。如果您使用的是Hibernate Annotations,那么说inverse=true的新方法是在父节点上使用mappedBy

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

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