当我尝试从属于 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 对象添加到票证并将 Reservation 对象添加到 TicketLine 对象
ticket.getLines().add(line);
session.save(ticket);
Reservation res = new Reservation();
res.setTicketLine(m_ticketline);
....
session.save(res);
按预期工作。正在创建 Reservations 中的记录,其中票证 ID 为 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]
仅当存在与该行关联的 Reservation 时才会出现此错误。有趣的是,在新会话中再次尝试不会引发异常,但保留不会被删除!
从 TicketLines 集合中删除一条线路可能发生在许多地方,即手动删除预订并不是一个真正的选择。我希望这可以由 Hibernate 管理,我刚刚对级联选项做错了。
请帮忙。