一尘不染

休眠状态:从列表中删除项目不会持久

hibernate

从列表中删除项目时遇到麻烦。该列表是在超类中定义的,但是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

谢谢。


阅读 229

收藏
2020-06-20

共1个答案

一尘不染

您必须将cascadeType.DELETE_ORPHAN明确指定。

尝试将代码更改为

@OneToMany    
@Cascade(cascade = {CascadeType.ALL, CascadeType.DELETE_ORPHAN}, mappedBy = "temporal")

来自hibernate文档的一部分

如果子对象的寿命受父对象的寿命限制,请通过指定CascadeType.ALL和org.hibernate.annotations.CascadeType.DELETE_ORPHAN来使父对象成为完整的生命周期对象(有关孤儿的语义,请参阅Hibernate参考指南)删除)

2020-06-20