使用Cascade.ALL和orphanRemoval = true删除OneToMany元素时出错

时间:2018-07-13 18:07:28

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

我正在尝试从工作中删除属性deliveryNotes的元素,但是当我查看jpa的日志时,我只会看到selects和任何delete 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=?
...

1 个答案:

答案 0 :(得分:1)

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

如果您已经这样做了(我无法从问题中得知),并且在work方法中使用了equals关系,那么将Work字段设置为{{ 1}}在调用null之前会更改对象的状态,并使remove返回false。从集合中删除该关系后,只需将其设置为equals