У меня есть 3 объекта, Party
, сопоставленный с одним номером с Invitation
, который отображается как многоToOne с Guest
. Определения JPA являются:Невозможно удалить сопоставленный объект, Hibernate JPA
партии Класс
@OneToMany(mappedBy="party", targetEntity=com.acme.party.model.Invitation.class)
@org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.LOCK})
@org.hibernate.annotations.LazyCollection(org.hibernate.annotations.LazyCollectionOption.FALSE)
private java.util.Set invitation = new java.util.HashSet();
Приглашение класса
@ManyToOne(targetEntity=com.acme.party.model.Party.class)
@org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType.LOCK})
@JoinColumns({ @JoinColumn(name="partyId", referencedColumnName="partyId", nullable=false) })
private com.acme.party.model.Party party;
@ManyToOne(targetEntity=com.acme.party.model.Guest.class)
@org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType.LOCK})
@JoinColumns({ @JoinColumn(name="guestId", referencedColumnName="guestId", nullable=false) })
private com.acme.party.model.Guest guest;
Гость Класс
@OneToMany(mappedBy="guest", targetEntity=com.acme.party.model.Invitation.class)
@org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.LOCK})
@org.hibernate.annotations.LazyCollection(org.hibernate.annotations.LazyCollectionOption.FALSE)
private java.util.Set invitation = new java.util.HashSet();
В экспортируемой базе данных, все внешние ключи устанавливаются on update cascade, on delete cascade
Моя проблема:
Внутри метода пользовательских обновлений, я пытаюсь удалить приглашения из Сторон. Удаляя Invitation
объектов с сайта party.invitations и представляя party
, я замечаю, что удаленные Invitations
все еще там.
party.getInvitation().remove(invitation12);
party.getInvitation().remove(invitation23);
session.saveOrUpdate(party);
К дополнительно удаление приглашения
party.getInvitation().remove(invitation12);
party.getInvitation().remove(invitation23);
session.delete(invitation12);
session.delete(invitation23);
session.saveOrUpdate(party);
Я получаю PersistentException:
org.orm.PersistentException: org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): [com.acme.party.model.Invitation#923]
Что я делаю неправильно? Должен ли я беспокоиться об ассоциациях, которые существуют в коде моего метода обновления, например. временные HashMaps, которые я использую для повторения приглашений? Или я должен пересмотреть мою каскадную стратегию?
1) Как вы получаете экземпляры 'приглашение12' и' приглашение23'? 2) После вызова 'party.getInvitation(). Remove (приглашение12);', 'приглашение12 'все еще находится в' party.getInvitation() 'set? –
@DraganBozanovic 1) Я получаю их от 'party.getInvitation()', хотя я итерации через них пару раз, перекрестные проверки с другой коллекцией. 2) Да, я уверен, что 'party.getInvitation()' не содержит их прямо перед тем, как я вызову 'session.saveOrUpdate (party)' – yannicuLar
Не могли бы вы разместить 'hashCode' и' equals' 'Invitation'? –