Почему 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<RoleRule> rules = new HashSet<RoleRule>(0);

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

}

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

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

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

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

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