从列表中删除项目时遇到问题.该列表在超类中定义,但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的语义)删除)
归档时间: |
|
查看次数: |
15328 次 |
最近记录: |