首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拥有cascade=的集合“all-delete-orphan”不再被拥有的实体实例引用,该如何处理?

拥有cascade=的集合“all-delete-orphan”不再被拥有的实体实例引用,该如何处理?
EN

Stack Overflow用户
提问于 2019-11-23 22:14:44
回答 1查看 439关注 0票数 1

这会有什么问题呢?

代码语言:javascript
复制
Caused by: org.hibernate.HibernateException: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance: com.en.test.father.Father.listSons
    at org.hibernate.engine.internal.Collections.processDereferencedCollection(Collections.java:99)
    at org.hibernate.engine.internal.Collections.processUnreachableCollection(Collections.java:50)
    at org.hibernate.event.internal.AbstractFlushingEventListener.flushCollections(AbstractFlushingEventListener.java:243)
    at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:86)
    at org.hibernate.event.internal.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:44)
    at org.hibernate.internal.SessionImpl.autoFlushIfRequired(SessionImpl.java:1251)
    at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:1962)
    at org.hibernate.internal.AbstractSessionImpl.list(AbstractSessionImpl.java:322)
    at org.hibernate.internal.SQLQueryImpl.list(SQLQueryImpl.java:125)
    at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:606)
    at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:483)

我的getter和setter方法

代码语言:javascript
复制
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
    @JoinColumn(name = "FATHERID", nullable = false)
    @OrderBy("id ASC")
    public List<Sons> getListSons() {
        return listSons;
    }

    public void setListSons(List<Sons> listSons) {
            this.listSons.clear();
            this.listSons.addAll(listSons);
    }

我认为列表不应该是初始化的,而应该是清空的,然后添加元素,但即使这样,我也得到了这个错误

EN

回答 1

Stack Overflow用户

发布于 2019-11-24 00:05:20

您尚未显示您的域模型,但可能是旧的子列表仍引用父实体。将每个子对象的父字段设置为空。它看起来像这样:

代码语言:javascript
复制
    public void setListSons(List<Sons> listSons) {
            this.listSons.stream().forEach(oldSon -> oldSon.setFather(null));
            this.listSons.clear();
            this.listSons.addAll(listSons);
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59008524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档