当前位置: 首页 > 面试题库 >

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

阎阎宝
2023-03-14
问题内容

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



 类似资料:
  • 问题内容: 从列表中删除项目时遇到麻烦。该列表是在超类中定义的,但是Hibernate批注将应用于子类中的属性访问器。超类中有两种方法可以操作列表。“添加”方法可以正常工作,但“删除”不能持久保存更改。我检查了我的Cascade设置,似乎一切正确。我在做一些不可能的事情吗?如果不是,我做错了什么吗? 这是我的课程: 我按如下方式使用TemporalAsset类的实例(请注意,我仅使用“refres

  • 问题内容: 在遍历列表时,我想根据条件删除列表中的项。请参见下面的代码。 这给了我一个例外。 如何才能做到这一点? 问题答案: 您需要使用和调用上,而不是使用循环。

  • 问题内容: 故事是,我应该能够将鲍勃,莎莉和杰克放进盒子里。我也可以从包装盒中取出。卸下后,将不留任何插槽。 我现在需要删除“鲍勃”。新的数组将是: 这是我的反应成分: 在这里,我向您展示了一个最少的代码,因为它包含更多内容(onClick等)。关键部分是从数组中删除,删除,销毁“ Bob”,但调用时不起作用。有任何想法吗?我一直在看这个,但由于使用React,所以我可能做错了。 问题答案: 要从

  • 我使用vuex persistedstate包https://github.com/robinvdvleuten/vuex-persistedstate以在浏览器上保持数据状态。 当我从应用程序注销时,软件包会清除所有关于已验证用户的状态信息。然而,我意识到,在关闭选项卡和jwt令牌过期后,它不会删除敏感数据,而且它仍然可以在本地存储上访问。 对此有什么建议吗?

  • 我的购物车有两个功能,第一个是退货总价和商品总数量: 这两个函数返回这两个参数: 和: 我可以通过此功能销毁所有购物车会话: 如何删除特定购物车项目?我在使用这个方法,它的工作。但它不会改变总价和总数量:

  • 我对Mongo的Webservice调用返回以下JSON。我需要迭代这个JSON值并删除Item-product_语言,因为它包含NULL/空字符串。 你对怎么做有什么想法吗? Python 3.4版本。 { }