Por que o Hibernate tenta excluir quando tento atualizar / inserir?

No meu aplicativo eu tenho esses tipos mapeados do Hibernate (caso geral):

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;
  }

}

Todas as classes têmequals() & hashCode() substituições.

Meu aplicativo permite ajustes de funções (apenas por administradores, não se preocupe) e, entre outros campos, permite a criação de novas regras de função. Quando uma nova regra é criada, tento criar uma novaRoleRule objeto e inseri-lo no campo da funçãorules. Eu chamosession.update(role) para aplicar as alterações ao banco de dados.

Agora vem a parte feia ... O Hibernate decide fazer o seguinte ao fechar a transação e liberar:

Insira a nova regra no banco de dados. Excelente.Atualize os outros campos de função (não coleções). Por enquanto, tudo bem.Atualize as regras existentes, mesmo que nada tenha mudado nelas. Eu posso viver com isso.Atualize as regras existentesnovamente. Aqui está uma pasta do log, incluindo o comentário automático:
/* delete one-to-many row Role.rules */
update ROLE_RULE set ROLE_ID=null where ROLE_ID=? and ROLE_RULE_ID=?

Naturalmente, todos os campos não são nulos e esta operação falha de forma espetacular.

Alguém pode tentar explicar por que o Hibernate faria isso? E ainda mais importante, como o frak eu fico por aí ???

EDITAR: Eu estava tão certo de que era algo a ver com o mapeamento, e então meu chefe, por um capricho, deletou oequals() ehashCode() em ambas as classes, recriou-as usando o Eclipse e, misteriosamente, isso resolveu o problema.

Ainda estou muito curioso sobre a minha pergunta. Alguém pode sugerir por que o Hibernate faria isso?

questionAnswers(4)

yourAnswerToTheQuestion