Ticket クラスに属するコレクションから TicketLine オブジェクトを削除しようとしたときに、「削除されたオブジェクトがカスケードによって再保存される」という問題が発生し、TicketLine にはクラス Reservation への OneToOne 関連付けがあります。
Tickets は、次の getter を使用して 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 は、TicketLines との OneToOne 関係を次のように定義します。
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 オブジェクトを ticket に追加し、Reservation オブジェクトを TicketLine オブジェクトに追加します。
ticket.getLines().add(line);
session.save(ticket);
Reservation res = new Reservation();
res.setTicketLine(m_ticketline);
....
session.save(res);
期待どおりに動作します。Reservations のレコードは、resource_id フィールドのチケット 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]
このエラーは、回線に予約が関連付けられている場合にのみ発生します。興味深いことに、新しいセッションでの 2 回目の試行は例外をスローしませんが、予約は削除されません!
TicketLines コレクションから行を削除することは、多くの場所で発生する可能性があります。つまり、予約を手動で削除することは、実際にはオプションではありません。これが Hibernate で管理できることを願っていますが、カスケード オプションに何か問題がありました。
助けてください。