休眠:从列表中删除项目不会保留

cod*_*ger 14 java 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; 
    } 
} 
Run Code Online (Sandbox Code Playgroud)

我使用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 
Run Code Online (Sandbox Code Playgroud)

谢谢.

Fox*_*BOA 19

您必须将Cascade显式指定为CascadeType.DELETE_ORPHAN.

尝试将代码更改为

@OneToMany    
@Cascade(cascade = {CascadeType.ALL, CascadeType.DELETE_ORPHAN}, mappedBy = "temporal")
Run Code Online (Sandbox Code Playgroud)

部分来自hibernate docs:

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

  • 根据http://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/annotations/CascadeType.html使用@OneToOne(orphanRemoval = true)或@OneToMany(orphanRemoval = true) (9认同)
  • 不推荐使用 CascadeType.DELETE_ORPHAN。有替代方案吗? (2认同)