Joe
Joe

Reputation: 7919

Error deleting OneToMany element with Cascade.ALL and orphanRemoval=true

I'm trying to delete an element of the property deliveryNotes from work but when I look at the log of jpa, I only see selects and any delete DML statement.

I already have another collections in work like orders and it works well and it is defined the same way as delivery notes.

What could it be?

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 log queries after saving work

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=?
...

Upvotes: 1

Views: 44

Answers (1)

StuPointerException
StuPointerException

Reputation: 7267

You need to make sure your DeliveryNote class implements the equals (and as a result hashcode) method. If it doesn't, then there's a good chance deliveryNotes.remove(note); will do nothing.

If you're already doing this (I can't tell from the question) and using the work relationship in the equals method, then setting the Work field to null before calling the remove changes the state of the object and causes equals to return false. Simply set the relationship to null after removing it from the collection.

Upvotes: 1

Related Questions