我无法找到一个好的答案,这就是我想知道的
我遇到以下情况的错误:我的gwt app,equipment_checkouts,equipment_checkins,equipment_types,events和equipment_types_events_xref中有几个表。结账和签到是为了保存已经检查过的所有内容的历史记录。
现在,这就是我遇到的情况。
每当我结账或检查设备类型时,都会创建一个新的设备结账/签到。但是,如果将EquipmentType / Event的EquipmentCheckout类中的Cascade类型设置为ALL,则可以正确创建xref_table引用,如果Cascade Type设置为any而不是ALL,则会获得异常“Collection不与任何会话关联”。
如果我将删除级联类型设置为All,那么几乎任何分配给事件的内容都会被删除。
我显然不理解设置级联的正确方法 - 如果有人可以帮我解决这个问题,我将不胜感激。
编辑:我想做的一切,当设备类型或事件被删除时,我希望它消灭掉所有的结账/签到历史记录 - 这就是......真的,但是没有将所有内容设置为CascadeType.ALL它会抛出一个例外
答案 0 :(得分:0)
所以,正如我从这句话中提到的那样:
编辑:我想做的一切,当设备类型或事件被删除时,我希望它消灭掉所有的结账/签到历史记录 - 这就是......真的,但是没有将所有内容设置为CascadeType.ALL它会抛出一个例外
您将equipment_type与例如equipment_checkouts相关联为OneToMany:
public class EquipmentType {
@Id
private long id;
@OneToMany(mappedBy = "equipmentType")
private List<EquipmentCheckout> checkouts
}
public class EquipmentCheckOut {
@Id
private long id;
@ManyToOne
private EquipmentType equipmentType;
}
根据我的理解,您应该在orphanRemoval = true
注释中使用@OneTomany
,并从另一侧optional = false
使用,以指明EquipmentCheckOut父级不能为空。我不确定,但是如果cascade = {CascadeType.REMOVE, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}
有父级(例如帐号),也许您应该使用CascadeType.ALL
代替EquipmentType
来防止错误情况。因此,结果将如下所示:
public class EquipmentType {
@Id
private long id;
@OneToMany(mappedBy = "equipmentType",
cascade = {CascadeType.REMOVE, CascadeType.DETACH, CascadeType.MERGE, cascadeType.REFRESH},
orphanRemoval = true))
private List<EquipmentCheckout> checkouts
}
public class EquipmentCheckOut {
@Id
private long id;
@ManyToOne(optional = false)
private EquipmentType equipmentType;
}
但正如Gonzalo Garcia Lasurtegui所说,你最好为我们提供更多信息(实体,映射等)