【问题标题】:Error deleting OneToMany element with Cascade.ALL and orphanRemoval=true使用 Cascade.ALL 和 orphanRemoval=true 删除 OneToMany 元素时出错
【发布时间】:2018-07-13 18:07:27
【问题描述】:

我正在尝试从工作中删除属性 deliveryNotes 的一个元素,但是当我查看 jpa 的日志时,我只看到选择和任何删除 DML 语句。

我已经有另一个系列在工作,比如订单,它运作良好,它的定义方式与交货单相同。

会是什么?

WorkBean.java

 public void deleteDeliveryNote(DeliveryNote note) {
        work.removeDeliveryNote(note);
        try {
            work = workSvc.save(work);
        } catch (Exception e) {
            logger.log(Level.SEVERE, "{0}{1}", new Object[]{Messages.getString(sesBean.getLocale(), "dnt_errdeleting"), e.getMessage()});
        }
    }

Work.java

@Entity
@Table(name = "t_work")
public class Work {
    ...
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "work", orphanRemoval = true)
    private Collection<DeliveryNote> deliveryNotes;
    ...

    public void addDeliveryNote(DeliveryNote note) {
        deliveryNotes.add(note);
        note.setWork(this);
    }

    public void removeDeliveryNote(DeliveryNote note) {
        note.setWork(null);
        deliveryNotes.remove(note);
    }
}

WorkService.java

@Stateless
public class WorkService {

    @PersistenceContext
    protected EntityManager em;

    public Work save(Work work) {

        if (work.getId() == null) {
            this.em.persist(work);
            return work;
        } else {
            return this.em.merge(work);
        }
    }
}

DeliveryNote.java

@Entity
@Table(name = "t_deliveryNote")
public class DeliveryNote extends BaseEntity {
...
    @Override
    public int hashCode() {
        int hash = 0;

        hash += (id != null ? id.hashCode() : 0);

        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }

        if (!(obj instanceof BaseEntity)) {
            return false;
        }

        BaseEntity other = (BaseEntity) obj;
        return id != null && id.equals(other.getId());
    }
...

保存工作后的 JPA 日志查询

19:35:31,354 INFO  [stdout](71): Hibernate: select work0_.id as id1_15_1_, work0_.version as version2_15_1_, work0_.date_u as date_u3_15_1_, work0_.date_c as date_c4_15_1_, work0_.date_d as date_d5_15_1_, work0_.idUser_c as idUser_c6_15_1_, work0_.idUser_d as idUser_d7_15_1_, work0_.idUser_u as idUser_14_15_1_, work0_.address as address8_15_1_, work0_.code as code9_15_1_, work0_.idCompany as idCompa15_15_1_, work0_.description as descrip10_15_1_, work0_.end as end11_15_1_, work0_.init as init12_15_1_, work0_.name as name13_15_1_, work0_.idWorkType as idWorkT16_15_1_, contacts1_.idWork as idWork11_16_3_, contacts1_.id as id1_16_3_, contacts1_.id as id1_16_0_, contacts1_.version as version2_16_0_, contacts1_.date_u as date_u3_16_0_, contacts1_.date_c as date_c4_16_0_, contacts1_.date_d as date_d5_16_0_, contacts1_.idUser_c as idUser_c6_16_0_, contacts1_.idUser_d as idUser_d7_16_0_, contacts1_.idUser_u as idUser_u9_16_0_, contacts1_.description as descript8_16_0_, contacts1_.idPerson as idPerso10_16_0_, contacts1_.idWork as idWork11_16_0_ from t_work work0_ left outer join t_workContact contacts1_ on work0_.id=contacts1_.idWork where work0_.id=?
19:35:31,382 INFO  [stdout](71): Hibernate: select user0_.id as id1_13_1_, user0_.version as version2_13_1_, user0_.date_u as date_u3_13_1_, user0_.date_c as date_c4_13_1_, user0_.date_d as date_d5_13_1_, user0_.idUser_c as idUser_c6_13_1_, user0_.idUser_d as idUser_d7_13_1_, user0_.idUser_u as idUser_10_13_1_, user0_.password as password8_13_1_, user0_.idPerson as idPerso11_13_1_, user0_.username as username9_13_1_, userroles1_.idUser as idUser4_14_3_, userroles1_.id as id1_14_3_, userroles1_.id as id1_14_0_, userroles1_.version as version2_14_0_, userroles1_.idRole as idRole3_14_0_, userroles1_.idUser as idUser4_14_0_ from t_user user0_ left outer join t_userRole userroles1_ on user0_.id=userroles1_.idUser where user0_.id=?
19:35:31,404 INFO  [stdout](71): Hibernate: select role0_.id as id1_2_1_, role0_.version as version2_2_1_, role0_.name as name3_2_1_, userrols1_.idRole as idRole3_14_3_, userrols1_.id as id1_14_3_, userrols1_.id as id1_14_0_, userrols1_.version as version2_14_0_, userrols1_.idRole as idRole3_14_0_, userrols1_.idUser as idUser4_14_0_ from a_role role0_ left outer join t_userRole userrols1_ on role0_.id=userrols1_.idRole where role0_.id=?
19:35:31,419 INFO  [stdout](71): Hibernate: select person0_.id as id1_10_0_, person0_.version as version2_10_0_, person0_.date_u as date_u3_10_0_, person0_.date_c as date_c4_10_0_, person0_.date_d as date_d5_10_0_, person0_.idUser_c as idUser_c6_10_0_, person0_.idUser_d as idUser_d7_10_0_, person0_.idUser_u as idUser_12_10_0_, person0_.email as email8_10_0_, person0_.firstname as firstnam9_10_0_, person0_.lastname as lastnam10_10_0_, person0_.phoneNumber as phoneNu11_10_0_ from t_person person0_ where person0_.id=?
19:35:31,437 INFO  [stdout](71): Hibernate: select role0_.id as id1_2_1_, role0_.version as version2_2_1_, role0_.name as name3_2_1_, userrols1_.idRole as idRole3_14_3_, userrols1_.id as id1_14_3_, userrols1_.id as id1_14_0_, userrols1_.version as version2_14_0_, userrols1_.idRole as idRole3_14_0_, userrols1_.idUser as idUser4_14_0_ from a_role role0_ left outer join t_userRole userrols1_ on role0_.id=userrols1_.idRole where role0_.id=?
19:35:31,455 INFO  [stdout](71): Hibernate: select user0_.id as id1_13_1_, user0_.version as version2_13_1_, user0_.date_u as date_u3_13_1_, user0_.date_c as date_c4_13_1_, user0_.date_d as date_d5_13_1_, user0_.idUser_c as idUser_c6_13_1_, user0_.idUser_d as idUser_d7_13_1_, user0_.idUser_u as idUser_10_13_1_, user0_.password as password8_13_1_, user0_.idPerson as idPerso11_13_1_, user0_.username as username9_13_1_, userroles1_.idUser as idUser4_14_3_, userroles1_.id as id1_14_3_, userroles1_.id as id1_14_0_, userroles1_.version as version2_14_0_, userroles1_.idRole as idRole3_14_0_, userroles1_.idUser as idUser4_14_0_ from t_user user0_ left outer join t_userRole userroles1_ on user0_.id=userroles1_.idUser where user0_.id=?
19:35:31,474 INFO  [stdout](71): Hibernate: select person0_.id as id1_10_0_, person0_.version as version2_10_0_, person0_.date_u as date_u3_10_0_, person0_.date_c as date_c4_10_0_, person0_.date_d as date_d5_10_0_, person0_.idUser_c as idUser_c6_10_0_, person0_.idUser_d as idUser_d7_10_0_, person0_.idUser_u as idUser_12_10_0_, person0_.email as email8_10_0_, person0_.firstname as firstnam9_10_0_, person0_.lastname as lastnam10_10_0_, person0_.phoneNumber as phoneNu11_10_0_ from t_person person0_ where person0_.id=?
19:35:31,492 INFO  [stdout](71): Hibernate: select user0_.id as id1_13_1_, user0_.version as version2_13_1_, user0_.date_u as date_u3_13_1_, user0_.date_c as date_c4_13_1_, user0_.date_d as date_d5_13_1_, user0_.idUser_c as idUser_c6_13_1_, user0_.idUser_d as idUser_d7_13_1_, user0_.idUser_u as idUser_10_13_1_, user0_.password as password8_13_1_, user0_.idPerson as idPerso11_13_1_, user0_.username as username9_13_1_, userroles1_.idUser as idUser4_14_3_, userroles1_.id as id1_14_3_, userroles1_.id as id1_14_0_, userroles1_.version as version2_14_0_, userroles1_.idRole as idRole3_14_0_, userroles1_.idUser as idUser4_14_0_ from t_user user0_ left outer join t_userRole userroles1_ on user0_.id=userroles1_.idUser where user0_.id=?
19:35:31,511 INFO  [stdout](71): Hibernate: select person0_.id as id1_10_0_, person0_.version as version2_10_0_, person0_.date_u as date_u3_10_0_, person0_.date_c as date_c4_10_0_, person0_.date_d as date_d5_10_0_, person0_.idUser_c as idUser_c6_10_0_, person0_.idUser_d as idUser_d7_10_0_, person0_.idUser_u as idUser_12_10_0_, person0_.email as email8_10_0_, person0_.firstname as firstnam9_10_0_, person0_.lastname as lastnam10_10_0_, person0_.phoneNumber as phoneNu11_10_0_ from t_person person0_ where person0_.id=?
19:35:31,531 INFO  [stdout](71): Hibernate: select company0_.id as id1_5_0_, company0_.version as version2_5_0_, company0_.date_u as date_u3_5_0_, company0_.date_c as date_c4_5_0_, company0_.date_d as date_d5_5_0_, company0_.idUser_c as idUser_c6_5_0_, company0_.idUser_d as idUser_d7_5_0_, company0_.idUser_u as idUser_12_5_0_, company0_.email as email8_5_0_, company0_.name as name9_5_0_, company0_.nif as nif10_5_0_, company0_.phoneNumber as phoneNu11_5_0_ from t_company company0_ where company0_.id=?
19:35:31,549 INFO  [stdout](71): Hibernate: select worktype0_.id as id1_4_1_, worktype0_.version as version2_4_1_, worktype0_.description as descript3_4_1_, worktype0_.name as name4_4_1_, works1_.idWorkType as idWorkT16_15_3_, works1_.id as id1_15_3_, works1_.id as id1_15_0_, works1_.version as version2_15_0_, works1_.date_u as date_u3_15_0_, works1_.date_c as date_c4_15_0_, works1_.date_d as date_d5_15_0_, works1_.idUser_c as idUser_c6_15_0_, works1_.idUser_d as idUser_d7_15_0_, works1_.idUser_u as idUser_14_15_0_, works1_.address as address8_15_0_, works1_.code as code9_15_0_, works1_.idCompany as idCompa15_15_0_, works1_.description as descrip10_15_0_, works1_.end as end11_15_0_, works1_.init as init12_15_0_, works1_.name as name13_15_0_, works1_.idWorkType as idWorkT16_15_0_ from a_workType worktype0_ left outer join t_work works1_ on worktype0_.id=works1_.idWorkType where worktype0_.id=?
19:35:31,590 INFO  [stdout](71): Hibernate: select company0_.id as id1_5_0_, company0_.version as version2_5_0_, company0_.date_u as date_u3_5_0_, company0_.date_c as date_c4_5_0_, company0_.date_d as date_d5_5_0_, company0_.idUser_c as idUser_c6_5_0_, company0_.idUser_d as idUser_d7_5_0_, company0_.idUser_u as idUser_12_5_0_, company0_.email as email8_5_0_, company0_.name as name9_5_0_, company0_.nif as nif10_5_0_, company0_.phoneNumber as phoneNu11_5_0_ from t_company company0_ where company0_.id=?
19:35:31,607 INFO  [stdout](71): Hibernate: select company0_.id as id1_5_0_, company0_.version as version2_5_0_, company0_.date_u as date_u3_5_0_, company0_.date_c as date_c4_5_0_, company0_.date_d as date_d5_5_0_, company0_.idUser_c as idUser_c6_5_0_, company0_.idUser_d as idUser_d7_5_0_, company0_.idUser_u as idUser_12_5_0_, company0_.email as email8_5_0_, company0_.name as name9_5_0_, company0_.nif as nif10_5_0_, company0_.phoneNumber as phoneNu11_5_0_ from t_company company0_ where company0_.id=?
19:35:31,626 INFO  [stdout](71): Hibernate: select deliveryno0_.id as id1_6_1_, deliveryno0_.version as version2_6_1_, deliveryno0_.date_u as date_u3_6_1_, deliveryno0_.date_c as date_c4_6_1_, deliveryno0_.date_d as date_d5_6_1_, deliveryno0_.idUser_c as idUser_c6_6_1_, deliveryno0_.idUser_d as idUser_d7_6_1_, deliveryno0_.idUser_u as idUser_11_6_1_, deliveryno0_.endTime as endTime8_6_1_, deliveryno0_.init as init9_6_1_, deliveryno0_.initTime as initTim10_6_1_, deliveryno0_.idDeliveryNoteType as idDeliv12_6_1_, deliveryno0_.idUserAux as idUserA13_6_1_, deliveryno0_.idWork as idWork14_6_1_, lines1_.idDeliveryNote as idDelive5_7_3_, lines1_.id as id1_7_3_, lines1_.id as id1_7_0_, lines1_.version as version2_7_0_, lines1_.amount as amount3_7_0_, lines1_.idDeliveryNote as idDelive5_7_0_, lines1_.description as descript4_7_0_ from t_deliveryNote deliveryno0_ left outer join t_deliveryNoteLine lines1_ on deliveryno0_.id=lines1_.idDeliveryNote where deliveryno0_.id=?
19:35:31,693 INFO  [stdout](71): Hibernate: select deliveryno0_.id as id1_0_1_, deliveryno0_.version as version2_0_1_, deliveryno0_.name as name3_0_1_, deliveryno1_.idDeliveryNoteType as idDeliv12_6_3_, deliveryno1_.id as id1_6_3_, deliveryno1_.id as id1_6_0_, deliveryno1_.version as version2_6_0_, deliveryno1_.date_u as date_u3_6_0_, deliveryno1_.date_c as date_c4_6_0_, deliveryno1_.date_d as date_d5_6_0_, deliveryno1_.idUser_c as idUser_c6_6_0_, deliveryno1_.idUser_d as idUser_d7_6_0_, deliveryno1_.idUser_u as idUser_11_6_0_, deliveryno1_.endTime as endTime8_6_0_, deliveryno1_.init as init9_6_0_, deliveryno1_.initTime as initTim10_6_0_, deliveryno1_.idDeliveryNoteType as idDeliv12_6_0_, deliveryno1_.idUserAux as idUserA13_6_0_, deliveryno1_.idWork as idWork14_6_0_ from a_deliveryNoteType deliveryno0_ left outer join t_deliveryNote deliveryno1_ on deliveryno0_.id=deliveryno1_.idDeliveryNoteType where deliveryno0_.id=?
19:35:31,759 INFO  [stdout](71): Hibernate: select lines0_.idDeliveryNote as idDelive5_7_0_, lines0_.id as id1_7_0_, lines0_.id as id1_7_1_, lines0_.version as version2_7_1_, lines0_.amount as amount3_7_1_, lines0_.idDeliveryNote as idDelive5_7_1_, lines0_.description as descript4_7_1_ from t_deliveryNoteLine lines0_ where lines0_.idDeliveryNote=?
19:35:31,767 INFO  [stdout](71): Hibernate: select lines0_.idDeliveryNote as idDelive5_7_0_, lines0_.id as id1_7_0_, lines0_.id as id1_7_1_, lines0_.version as version2_7_1_, lines0_.amount as amount3_7_1_, lines0_.idDeliveryNote as idDelive5_7_1_, lines0_.description as descript4_7_1_ from t_deliveryNoteLine lines0_ where lines0_.idDeliveryNote=?
19:35:31,775 INFO  [stdout](71): Hibernate: select deliveryno0_.id as id1_7_0_, deliveryno0_.version as version2_7_0_, deliveryno0_.amount as amount3_7_0_, deliveryno0_.idDeliveryNote as idDelive5_7_0_, deliveryno0_.description as descript4_7_0_ from t_deliveryNoteLine deliveryno0_ where deliveryno0_.id=?
19:35:31,785 INFO  [stdout](71): Hibernate: select deliveryno0_.id as id1_7_0_, deliveryno0_.version as version2_7_0_, deliveryno0_.amount as amount3_7_0_, deliveryno0_.idDeliveryNote as idDelive5_7_0_, deliveryno0_.description as descript4_7_0_ from t_deliveryNoteLine deliveryno0_ where deliveryno0_.id=?
19:35:31,795 INFO  [stdout](71): Hibernate: select lines0_.idDeliveryNote as idDelive5_7_0_, lines0_.id as id1_7_0_, lines0_.id as id1_7_1_, lines0_.version as version2_7_1_, lines0_.amount as amount3_7_1_, lines0_.idDeliveryNote as idDelive5_7_1_, lines0_.description as descript4_7_1_ from t_deliveryNoteLine lines0_ where lines0_.idDeliveryNote=?
19:35:31,808 INFO  [stdout](71): Hibernate: select lines0_.idDeliveryNote as idDelive5_7_0_, lines0_.id as id1_7_0_, lines0_.id as id1_7_1_, lines0_.version as version2_7_1_, lines0_.amount as amount3_7_1_, lines0_.idDeliveryNote as idDelive5_7_1_, lines0_.description as descript4_7_1_ from t_deliveryNoteLine lines0_ where lines0_.idDeliveryNote=?
19:35:31,816 INFO  [stdout](71): Hibernate: select deliveryno0_.id as id1_6_1_, deliveryno0_.version as version2_6_1_, deliveryno0_.date_u as date_u3_6_1_, deliveryno0_.date_c as date_c4_6_1_, deliveryno0_.date_d as date_d5_6_1_, deliveryno0_.idUser_c as idUser_c6_6_1_, deliveryno0_.idUser_d as idUser_d7_6_1_, deliveryno0_.idUser_u as idUser_11_6_1_, deliveryno0_.endTime as endTime8_6_1_, deliveryno0_.init as init9_6_1_, deliveryno0_.initTime as initTim10_6_1_, deliveryno0_.idDeliveryNoteType as idDeliv12_6_1_, deliveryno0_.idUserAux as idUserA13_6_1_, deliveryno0_.idWork as idWork14_6_1_, lines1_.idDeliveryNote as idDelive5_7_3_, lines1_.id as id1_7_3_, lines1_.id as id1_7_0_, lines1_.version as version2_7_0_, lines1_.amount as amount3_7_0_, lines1_.idDeliveryNote as idDelive5_7_0_, lines1_.description as descript4_7_0_ from t_deliveryNote deliveryno0_ left outer join t_deliveryNoteLine lines1_ on deliveryno0_.id=lines1_.idDeliveryNote where deliveryno0_.id=?
19:35:31,840 INFO  [stdout](71): Hibernate: select deliveryno0_.id as id1_0_1_, deliveryno0_.version as version2_0_1_, deliveryno0_.name as name3_0_1_, deliveryno1_.idDeliveryNoteType as idDeliv12_6_3_, deliveryno1_.id as id1_6_3_, deliveryno1_.id as id1_6_0_, deliveryno1_.version as version2_6_0_, deliveryno1_.date_u as date_u3_6_0_, deliveryno1_.date_c as date_c4_6_0_, deliveryno1_.date_d as date_d5_6_0_, deliveryno1_.idUser_c as idUser_c6_6_0_, deliveryno1_.idUser_d as idUser_d7_6_0_, deliveryno1_.idUser_u as idUser_11_6_0_, deliveryno1_.endTime as endTime8_6_0_, deliveryno1_.init as init9_6_0_, deliveryno1_.initTime as initTim10_6_0_, deliveryno1_.idDeliveryNoteType as idDeliv12_6_0_, deliveryno1_.idUserAux as idUserA13_6_0_, deliveryno1_.idWork as idWork14_6_0_ from a_deliveryNoteType deliveryno0_ left outer join t_deliveryNote deliveryno1_ on deliveryno0_.id=deliveryno1_.idDeliveryNoteType where deliveryno0_.id=?
...

【问题讨论】:

    标签: java hibernate jpa jakarta-ee java-ee-7


    【解决方案1】:

    您需要确保您的DeliveryNote 类实现了equals(并因此实现了hashcode)方法。如果没有,那么deliveryNotes.remove(note); 很有可能什么都不做。

    如果您已经这样做了(我无法从问题中看出)并在 equals 方法中使用 work 关系,那么在调用 @987654329 之前将 Work 字段设置为 null @ 更改对象的状态并导致 equals 返回 false。从集合中删除后,只需将关系设置为null。

    【讨论】:

    • equals 被覆盖并删除它的工作。我对其他收藏也这样做,而且效果很好。这是一种奇怪的情况。
    • 奇怪。这是一个很长的镜头,但是您可以尝试删除note.setWork(null); 电话吗?它不应该是必需的,因为无论如何该实体都将被删除。
    • 我试过没有 note.setWork(null) 和相同的结果。我会继续搜索这是什么问题。
    • 当你得到结果时发布一个答案,这肯定让我很难过!祝你好运:)
    猜你喜欢
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 2015-06-05
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多