从列表中删除项目时遇到麻烦。该列表是在超类中定义的,但是Hibernate批注将应用于子类中的属性访问器。超类中有两种方法可以操作列表。“添加”方法可以正常工作,但“删除”不能持久保存更改。我检查了我的Cascade设置,似乎一切正确。我在做一些不可能的事情吗?如果不是,我做错了什么吗?
这是我的课程:
@Entity abstract class Temporal<T> { @Id @GeneratedValue private Long id; @Version private Integer version = null; @Transient protected List<T> content = new ArrayList<T>(); public void remove(T value) { // business logic ... content.remove(value); } public void add(T value) { // business logic ... content.add(value); } } @Entity @AccessType("property") class TemporalAsset extends Temporal<Asset> { @OneToMany(cascade = CascadeType.ALL, mappedBy = "temporal") public List<Asset> getContent() { return super.content; } protected void setContent(List<Asset> list) { super.content = list; } }
我按如下方式使用TemporalAsset类的实例(请注意,我仅使用“ refresh”方法来演示此行为。即使刷新或关闭会话并打开新的会话,列表也无法正确保存):
temporalAsset.add(value1); temporalAsset.getContent().size() == 1; // true session.update(temporalAsset); session.refresh(temporalAsset); temporalAsset.getContent().size() == 1; // true temporalAsset.remove(value1); temporalAsset.getContent().size() == 0; // true session.update(temporalAsset); session.refresh(temporalAsset); temporalAsset.getContent().size() == 0; // false, its 1
谢谢。
您必须将cascadeType.DELETE_ORPHAN明确指定。
尝试将代码更改为
@OneToMany @Cascade(cascade = {CascadeType.ALL, CascadeType.DELETE_ORPHAN}, mappedBy = "temporal")
来自hibernate文档的一部分:
如果子对象的寿命受父对象的寿命限制,请通过指定CascadeType.ALL和org.hibernate.annotations.CascadeType.DELETE_ORPHAN来使父对象成为完整的生命周期对象(有关孤儿的语义,请参阅Hibernate参考指南)删除)