【发布时间】:2017-03-18 10:27:01
【问题描述】:
我总是被告知,在双向关系的情况下,您删除您的实体如下:
- 细分关系
- 更新所有者实体
- 删除实体
但是现在我的主键是关系的一部分,所以这不再可能了。
有没有人知道在这种情况下如何删除具有主外键的实体?
我尝试将“mappedby”属性设置为 null,而不仅仅是调用 manager.remove(...),但总有另一个实体管理器仍然具有已删除实体的托管实例,所以我得到了以下错误:
During synchronization a new object was found through a relationship
that was not marked cascade PERSIST
下面我放了我正在使用的类的代码。
这里的OrderBill 类的主外键指向OrderWeek。这个主键也是一个复合键,遗憾的是使代码的可读性降低了一点,但它对我遇到的问题没有任何影响。
public class OrderBill{
@EmbeddedId
private OrderWeekPK orderWeekPK;
@OneToOne
@JoinColumns(value = {
@JoinColumn(name="weekNr", referencedColumnName = "weekNr"),
@JoinColumn(name="yearNr", referencedColumnName = "yearNr")})
@MapsId
private OrderWeek orderWeek;
}
public class OrderWeek{
@OneToOne(mappedBy="orderWeek")
private OrderBill orderBill;
@EmbeddedId
private OrderWeekPK orderWeekPK;
}
@Embeddable
public class OrderWeekPK implements Serializable{
@Column(name="yearNr")
private int yearNr;
@Column(name="weekNr")
private int weekNr;
}
是否有一些我缺少的策略?
更新:现在我可以通过切换拥有方和拥有方来规避这个问题(将 mappedby 转移到 OrderBill 类)。现在我可以在不触及外主键的情况下打破关系。
这个“解决方案”仍然不够理想:OrderWeek 现在有一个冗余列(例如 weekNr2 和 yearNr2)与主键(或应该)相同
也许这可以帮助遇到相同问题的人,直到找到实际的解决方案。
【问题讨论】:
-
不清楚您使用 MapsId 注释的目的。您只是想将这种关系标记为@Id 吗?这将允许 OrderBill 使用 OrderWeekPK 作为它的 pkClass。
-
@Chris 只是将该字段标记为外键,表示该字段使用OrderWeek的pk。 (This 站点可能会更好地解释它)但是很明显,我没有意识到我没有在我的代码 sn-p 中为 OrderBill 放置一个 \@embeddedid。这个错误可能让很多人感到困惑,将立即编辑。
标签: java jpa entity eclipselink