Hibernate Cascade ALL与PERSIST导致集合无关联异常

时间:2012-02-03 06:30:28

标签: hibernate gwt jpa cascade

我无法找到一个好的答案,这就是我想知道的

我遇到以下情况的错误:我的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它会抛出一个例外

1 个答案:

答案 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所说,你最好为我们提供更多信息(实体,映射等)