¿Por qué Hibernate intenta eliminar cuando intento actualizar / insertar?

En mi aplicación tengo estos tipos de mapas de Hibernate (caso general):

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 las clases tienenequals() & hashCode() anulaciones

Mi aplicación permite ajustar roles (solo por administradores de sistemas, no se preocupe), y entre otros campos, permite la creación de nuevas reglas de rol. Cuando se crea una nueva regla, trato de crear una nueva regla.RoleRule Objeto e insértalo en el campo del rol.rules. Yo lo llamosession.update(role) Para aplicar los cambios a la base de datos.

Ahora viene la parte fea ... Hibernate decide hacer lo siguiente al cerrar la transacción y vaciar:

Insertar la nueva regla en la base de datos. Excelente.Actualizar los otros campos de rol (no colecciones). Hasta ahora tan bueno.Actualice las reglas existentes, incluso si nada ha cambiado en ellas. Puedo vivir con esto.Actualizar las reglas existentes.otra vez. Aquí hay una pasta del registro, incluyendo el comentario automático:
/* delete one-to-many row Role.rules */
update ROLE_RULE set ROLE_ID=null where ROLE_ID=? and ROLE_RULE_ID=?

Por supuesto, todos los campos son nulos, y esta operación falla espectacularmente.

¿Alguien puede intentar explicar por qué Hibernate haría esto? Y lo que es más importante, ¿cómo diablos me las arreglo?

EDITAR: Estaba seguro de que tenía algo que ver con el mapeo, y luego mi jefe, por un capricho, eliminó elequals() yhashCode() en ambas clases, los recrearon usando Eclipse, y misteriosamente esto resolvió el problema.

Todavía tengo mucha curiosidad acerca de mi pregunta. ¿Alguien puede sugerir por qué Hibernate haría esto?

Respuestas a la pregunta(4)

Su respuesta a la pregunta