Hibernate Cascade ALL vs. PERSIST вызывает коллекцию не связанное исключение - PullRequest
1 голос
/ 03 февраля 2012

Я не мог найти хороший ответ на этот вопрос, вот что мне интересно

Я столкнулся с ошибкой в ​​следующей ситуации: у меня есть несколько таблиц в моем приложении gwt, equipment_checkouts,equipment_checkins, equipment_types, события, и equipment_types_events_xref.Оформление заказа и возвраты предназначены для хранения истории всего, что было проверено и получено.

Теперь вот что я наталкиваюсь.

всякий раз, когда я проверяю или проверяю тип оборудования,Оформление нового оборудования оформлено просто отлично.Однако, если тип Cascade в классе EquipmentCheckout для EquipmentType / Event установлен на ALL, ссылка xref_table создается нормально, если для типа Cascade задано значение, отличное от ALL, я получаю исключение «Коллекция не связана ни с одним сеансом».

Когда я иду, чтобы удалить, если тип каскада установлен на Все, почти все, что назначено событию, удаляется.

Я явно не понимаю правильный способ настройки каскадирования - ЕслиКто-нибудь может помочь мне решить эту проблему, и это было бы очень признательно.

edit: все, что я хочу сделать, когда тип_оборудования или событие удалено, я хочу, чтобы он уничтожил всю историю проверок / проверок - вот и все... на самом деле, но, не устанавливая все в CascadeType.ALL, выдается исключение

1 Ответ

0 голосов
/ 03 февраля 2012

Итак, как я уже упоминал из этих слов:

edit: все, что я хочу сделать, когда тип_оборудования или событие удалено, я хочу, чтобы он уничтожил всю историю проверок / проверок -это ... действительно так, но не устанавливая все в 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 есть родитель (например, для учетной записи).Таким образом, результат будет выглядеть следующим образом:

открытый класс 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;

}

Но, как отметил Гонсало Гарсия Ласуртеги, вам лучше предложить нам больше информации (сущности, сопоставления и т. Д.)

...