Spring Data JPA: equals und hashcode

DrPils

Bekanntes Mitglied
Hi

Wie sieht denn das überladen von hashCode() und equals() in Entity Klassen aus?

Mein erster Gedanke wäre, nur die ID zu nehmen, hier sehe ich jedoch das Problem, dass dann zwei eigentlich gleiche Objekte in der Tabelle landen können. Vermutlich wird ja mit equals geprüft ob das Entity schon in der Tabelle ist.
Java:
import javax.persistence.*;

@Entity
public class Person {

    @Id
    @GeneratedValue
    private Long id;
    private String name;

    /*
    getter and setter
     */

    @Override
    public boolean equals(Object o) {
        if (!(o instanceof Person)) return false;
        Person person = (Person) o;
        return id != null ? id.equals(person.id) : person.id == null;
    }

    @Override
    public int hashCode() {
        return id != null ? id.hashCode() : 0;
    }
}

class Test {
    public static void main(String[] args) {
        Person person = new Person("Hans");
        Person person1 = new Person("Hans"); //equals ergibt false, sollten also beide in die DB geschrieben werden
    }
}

Gegen alle Attribute spricht wohl dass unterschiedliche Objekte, unterschiedliche IDs haben sollten, was meiner meinung nach es Redundant macht sowohl ID als auch die restlichen Attribute in equals und hashcode zu verwenden.

Mein Gedanke ist nun, dass es der beste Weg ist, alle Attribute, bis auf die ID zu nehmen.

Wie macht ihr es, bzw. wie ist es richtig?


Edit:
Gerade gesehen, dass ich im falschen Forum gelandet bin. Sorry dafür...
Kann ein Mod das bitte nach Frameworks vershcieben?
 
Zuletzt bearbeitet:

mrBrown

Super-Moderator
Mitarbeiter
Damit Gleichheit dabei konsistent mit der Datenbank ist, musst du:
* nur die ID nutzen
* null als ungleich null behandeln (zwei Objekte ohne ID sind nicht gleich)
* je nach Art der ID-Erzeugung entweder einen festen Wert als HashCode nutzen (zB '0') oder wieder nur die ID (HashCode darf sich nicht ändern, wenn die ID erst beim Speichern erzeugt wird, hätte man vor und nach dem speichern sonst unterschiedliche HashCodes
 

Oneixee5

Top Contributor
HashCode darf sich nicht ändern, wenn die ID erst beim Speichern erzeugt wird, hätte man vor und nach dem speichern sonst unterschiedliche HashCodes
Mit dieser Aussage habe ich so ein paar Probleme. In der API steht:
Wenn die Methode hashCode während der Ausführung einer Java-Anwendung mehr als einmal für dasselbe Objekt aufgerufen wird, muss sie stets dieselbe ganze Zahl zurückgeben, vorausgesetzt, dass keine Informationen, die in Gleichheitsvergleichen für das Objekt verwendet werden, geändert werden.
Eine Änderung der ID einer Entität kann demnach durchaus zu einer Änderung des Hashcodes führen, wenn sich die ID bspw. von null zu 1 ändert. Dabei setzte ich mal voraus, dass ID ein wesentliches Kriterium in der Methode equals ist. Es ist einfach nur sehr ungeschickt eine Entität als Key einer HashMap (o.ä.) zu verwenden, wenn diese noch nicht gespeichert wurde - und deshalb die ID den Wert null hat. Imho kann man das auch bei Bloch so nachlesen.
 

Ähnliche Java Themen


Oben