Warum versucht der Ruhezustand zu löschen, wenn ich versuche, zu aktualisieren / einzufügen?

In meiner App habe ich folgende Hibernate-Mapped-Typen (allgemeiner Fall):

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

}

Alle Klassen habenequals() & hashCode() überschreibt.

Meine Anwendung ermöglicht das Optimieren von Rollen (nur für Systemadministratoren, keine Sorge) und ermöglicht unter anderem das Erstellen neuer Rollenregeln. Wenn eine neue Regel erstellt wird, versuche ich, eine neue zu erstellenRoleRule Objekt und fügen Sie es in das Feld der Rollerules. Ich rufesession.update(role) um die Änderungen in die Datenbank zu übernehmen.

Nun kommt der hässliche Teil ... Hibernate beschließt, beim Schließen der Transaktion und beim Leeren Folgendes zu tun:

Fügen Sie die neue Regel in die Datenbank ein. Ausgezeichnet.Aktualisieren Sie die anderen Rollenfelder (nicht Sammlungen). So weit, ist es gut.Aktualisieren Sie die vorhandenen Regeln, auch wenn sich daran nichts geändert hat. Ich kann damit leben.Aktualisieren Sie die vorhandenen Regelnnochmal. Hier ist ein Einfügen aus dem Protokoll, einschließlich des automatischen Kommentars:
/* delete one-to-many row Role.rules */
update ROLE_RULE set ROLE_ID=null where ROLE_ID=? and ROLE_RULE_ID=?

Natürlich sind alle Felder nicht null, und diese Operation schlägt auf spektakuläre Weise fehl.

Kann jemand versuchen zu erklären, warum Hibernate dies tun würde ??? Und was noch wichtiger ist, wie zum Teufel komme ich damit klar ???

BEARBEITEN: Ich war mir so sicher, dass es etwas mit dem Mapping zu tun hatte, und dann hat mein Chef aus einer Laune heraus das gelöschtequals() undhashCode() In beiden Klassen wurden sie mit Eclipse neu erstellt, und das Problem wurde auf mysteriöse Weise gelöst.

Ich bin immer noch sehr neugierig auf meine Frage. Kann jemand vorschlagen, warum Hibernate dies tun würde?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage