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

Hibernate:从列表中删除项不会持久

狄奕
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明确指定为cascade。

尝试将代码更改为

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

来自休眠文档的一部分:

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



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

  • 我已经创建了纸张和Mcq问题之间的映射如下。 } 当我更新纸质实体时,它会删除所有MCQ。 SQL输出:

  • 当我更改ListViewAdapter时,我的项目将无法从ListView中清除,并且我有一些空白条目。 她是我的密码:

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

  • 问题内容: 我在Hibernate中有标准协会。更新时,我正在创建新实体(使用关键字),并用必要的值(还插入ID)填充它。值来自UI。以相同的方式,我创建了子对象的新集合,用值(也插入了ID)填充每个子对象,并将集合存储在父对象中(使用setter或按方法)。 所以我的问题是:如何在更新父级时删除父级集合中的所有对象,并用新的集合替换它们。在新集合中,某些对象确实是新对象,而某些对象仅需要更新(它

  • 问题内容: 我在Python中有一个列表列表: 我想从中删除重复的元素。如果这是正常列表,而不是我可以使用的列表set。但不幸的是,该列表不可散列,因此无法建立一组列表。只有元组。因此,我可以将所有列表转换为元组,然后使用set并返回列表。但这不是很快。 如何以最有效的方式做到这一点? 上面的结果应为: 我不在乎保留订单。 注意:这个问题很相似,但不是我所需要的。搜索了SO,但没有找到确切的重复项