Почему Hibernate пытается удалить, когда я пытаюсь обновить / вставить?

В моем приложении у меня есть эти типы, отображаемые в Hibernate (общий случай):

class RoleRule {
  private Role role;
  private PermissionAwareEntity entity; // hibernate-mapped entity for which permission is granted
  private PermissionType permissionType; // enum

  @ManyToOne
  @JoinColumn(name = "ROLE_ID")
  public Role getRole() {
    return role;
  }
  public void setRole(Role role) {
    this.role = role;
  }

}

class Role {
  private Set rules = new HashSet(0);

  @OneToMany(cascade=CascadeType.ALL)
  @JoinColumn(name="ROLE_ID")
  public Set getRules() {
    return rules;
  }
  public void setRules(Set rules) {
    this.rules = rules;
  }

}

Все классы имеютequals() & hashCode() переопределение.

Мое приложение позволяет изменять роли (только для системных администраторов, неt беспокойство), и среди других областей, позволяет создавать новые правила ролей. Когда создается новое правило, я пытаюсь создать новоеRoleRule объект и вставить его в рольполе сrules, Я звонюsession.update(role) применить изменения к базе данных.

Теперь наступает ужасная часть ... Hibernate решает сделать следующее при закрытии транзакции и сбросе:

Вставьте новое правило в базу данных. Отлично.Обновите другие поля роли (не коллекции). Все идет нормально.Обновите существующие правила, даже если в них ничего не изменилось. Я могу жить с этим.Обновите существующие правиласнова, Вот's вставка из журнала, включая автоматический комментарий:

/* delete one-to-many row Role.rules */
update ROLE_RULE set ROLE_ID=null where ROLE_ID=? and ROLE_RULE_ID=?

Конечно, все поля не равны NULL, и эта операция завершается неудачно.

Может кто-нибудь попытаться объяснить, почему Hibernate сделал бы это ??? И даже более важно, как я могу обойти это?

РЕДАКТИРОВАТЬЯ был уверен, что это как-то связано с картированием, а потом мой босс по прихоти удалилequals() а такжеhashCode() в обоих классах воссоздали их с помощью Eclipse, и загадочным образом это решило проблему.

Мне все еще очень любопытно по поводу моего вопроса. Кто-нибудь может подсказать, почему Hibernate сделал бы это?

Ответы на вопрос(4)

Ваш ответ на вопрос