从列表中删除项目时遇到问题.该列表在超类中定义,但Hibernate注释应用于子类中的属性访问器.超类中有两种方法可以操作列表."添加"方法工作正常,但"删除"不会持续更改.我检查了我的Cascade设置,我似乎有正确的事情.我做的事情是不可能的.如果没有,我做错了吗?
这是我的课程:
@Entity abstract class Temporal{ @Id @GeneratedValue private Long id; @Version private Integer version = null; @Transient protected List content = new ArrayList (); 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 { @OneToMany(cascade = CascadeType.ALL, mappedBy = "temporal") public List getContent() { return super.content; } protected void setContent(List list) { super.content = list; } }
我使用TemporalAsset类的实例如下(请注意,我只使用"刷新"方法来演示行为.即使我刷新或关闭会话并打开新会话,列表也不会正确保留):
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
谢谢.
您必须将Cascade显式指定为CascadeType.DELETE_ORPHAN.
尝试将代码更改为
@OneToMany @Cascade(cascade = {CascadeType.ALL, CascadeType.DELETE_ORPHAN}, mappedBy = "temporal")
部分来自hibernate docs:
如果子对象的生命周期受父对象的生命周期限制,则通过指定CascadeType.ALL和org.hibernate.annotations.CascadeType.DELETE_ORPHAN使父对象成为完整的生命周期对象(请参阅Hibernate参考指南了解orphan的语义)删除)