Я сталкиваюсь с проблемой «удаленный объект будет повторно сохранен каскадно», когда пытаюсь удалить объект TicketLine из коллекции, принадлежащей классу Ticket, а TicketLine имеет ассоциацию OneToOne с классом Reservation.
Tickets определяет коллекцию TicketLines со следующим геттером
class Tickets
...
@OneToMany(targetEntity = TicketLine.class, fetch = FetchType.EAGER)
@Fetch(org.hibernate.annotations.FetchMode.SUBSELECT)
@Cascade({org.hibernate.annotations.CascadeType.ALL,
org.hibernate.annotations.CascadeType.LOCK,
org.hibernate.annotations.CascadeType.DELETE_ORPHAN,})
public List<TicketLine> getLines() {
return ticketlines;
}
....
класс Reservation определяет отношение OneToOne к TicketLines следующим образом:
class Reservation
...
@OneToOne()
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
@JoinColumn(name = "resource_id")
public TicketLine getTicketLine() {
return ticketLine;
}
Добавление объекта TicketLine к билету и объекта Reservation к объекту TicketLine с помощью
ticket.getLines().add(line);
session.save(ticket);
Reservation res = new Reservation();
res.setTicketLine(m_ticketline);
....
session.save(res);
работает как положено. Запись в Reservations создается с идентификатором тикета в поле resource_id.
Когда я удаляю строку из коллекции, которая имеет связанный объект Reservation, я получаю следующую ошибку:
Save ticket failed: org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): [org.myapp.hibernate.TicketLine#ff8081814a45ebb5014a45ebe4540003]
Эта ошибка возникает только в том случае, если с линией связано резервирование. Интересно, что вторая попытка в новом сеансе не вызывает исключение, но резервирование не удаляется!
Удаление строки из коллекции TicketLines может происходить во многих местах, т. е. удаление резервирования вручную на самом деле не вариант. Я надеюсь, что Hibernate может управлять этим, и я только что сделал что-то не так с параметрами каскада.
Пожалуйста помоги.