【问题标题】:A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance how to deal with it?拥有的实体实例不再引用具有 cascade="all-delete-orphan" 的集合如何处理?
【发布时间】:2023-03-17 22:38:01
【问题描述】:

这可能是什么问题?

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 方法

@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);
    }

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

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

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

        public void setListSons(List<Sons> listSons) {
                this.listSons.stream().forEach(oldSon -> oldSon.setFather(null));
                this.listSons.clear();
                this.listSons.addAll(listSons);
        }
    

    【讨论】:

      猜你喜欢
      • 2012-03-14
      • 2011-08-01
      • 2021-01-09
      • 1970-01-01
      • 2018-03-06
      • 2016-11-26
      • 2018-10-08
      • 2020-05-28
      相关资源
      最近更新 更多