gpt4 book ai didi

java - org.hibernate.ObjectDeletedException : deleted object would be re-saved by cascade when collection objecs have a one to one association

转载 作者:行者123 更新时间:2023-12-01 12:07:56 32 4
gpt4 key购买 nike

当我尝试从属于 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);

按预期工作。正在使用资源 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]

仅当存在与该线路关联的预订时,才会出现此错误。有趣的是,在新 session 中进行第二次尝试不会引发异常,但保留不会被删除!

从 TicketLines 集合中删除一行可能会在很多地方发生,即手动删除预订并不是真正的选择。我希望这可以由 Hibernate 来管理,我刚刚在级联选项上做了一些错误的事情。

请帮忙。

最佳答案

以下代码已消除异常。然而,现在的问题是,尽管存在预订记录,但 line.getReservation() 始终返回 null。

更新:添加mappedBy属性

@OneToOne(mappedBy="reservation")

在预订中解决了最后一个问题。 line.getReservation() 现在也可以使用。抱歉打扰您了。

第二次更新:只要二级缓存有效,前面建议的解决方案就有效。重新加载对象后,NPE 再次发生。在研究了一些关于拥有一段关系的术语之后,我得出了以下最终有效的解决方案。

类 Tickets 像以前一样定义了 TicketLines 的集合。

class TicketLine 定义关系如下:

class TicketLine
...
private reservation;
...

@OneToOne(mappedBy="ticketline", cascade= CascadeType.ALL, fetch= FetchType.EAGER)
@JoinColumn(name="id", referencedColumnName="resource_id")
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
public Reservation getReservation() {
return reservation;
}
...

Reservation 类定义了与 TicketLines 的 OneToOne 关系,如下所示:

class Reservation 
...
privat TicketLine ticketline;
...
@OneToOne(fetch= FetchType.EAGER)
@JoinColumn(name = "resource_id", insertable=false, updatable=false)
public TicketLine getTicketline() {
return ticketline;
}
...

也许我需要解释一下,我已将字段命名为resource_id,以便将来它也可以用于其他类型的一对一关系。但目前这应该不会发挥作用。

现在将 TicketLine 对象添加到票证并将 Reservation 对象添加到 TicketLine 对象:

ticket.getLines().add(line);
session.save(ticket);

Reservation res = new Reservation();
/* set property values */
/* line might not yet have an id at that pit of time, but we need one! */
sesssion.save(line);
/* Instead of explicitly setting resource_id I tried to call
res.setTicketline(line);
but this will not set the resource_id as I expected
*/
res.setResource_id(line.getId());
m_ticketline.setReservation(res);
....
/* session.save(res);
res is now saved when the ticket containing the line will be saved later*/
....
session.save(ticket);

保存行并删除行

ticket.getLines().remove(line);
session.save(ticket);

或删除机票的所有线路(和预订)以及机票

session.delete(票证);

一切都按预期进行。

我对许多更改表示歉意,但这对我来说很难解决,我想提供一个实际有效的答案。

谢谢。

关于java - org.hibernate.ObjectDeletedException : deleted object would be re-saved by cascade when collection objecs have a one to one association,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27465253/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com