Hibernate: Wie behebt man „Bezeichner einer Instanz geändert von X nach Y“?

Lesezeit: 3 Minuten

Benutzer-Avatar
gennad

org.hibernate.HibernateException: identifier of an instance 
of org.cometd.hibernate.User altered from 12 to 3

eigentlich meine user Die Tabelle muss ihren Wert wirklich dynamisch ändern, meine Java-App ist multithreaded. Irgendwelche Ideen, wie man es repariert?

  • Ihre Benutzertabelle muss ihren Wert ändern? Welcher Wert? Die Benutzertabelle enthält vermutlich mehrere Zeilen mit jeweils mehreren Werten …

    – Verdienst

    14. November 2010 um 20:20 Uhr

  • from [number] to 0 Bei mir trat auf, wenn ich Live-Objekte speichere, anstatt sie zu aktualisieren.

    – Amir Azizkhani

    5. Oktober 2020 um 13:01 Uhr


  • Versuchen Sie, den Eigenschaftsnamen der db-Spalte in Ihrem Modell zu ändern. Ich habe ein ähnliches Problem und löse das Problem in dieser Antwort stackoverflow.com/a/66395423/15293948

    – Neuer

    27. Februar 2021 um 3:58 Uhr

Ändern Sie irgendwo den Primärschlüsselwert eines Benutzerobjekts? Das solltest du nicht tun. Überprüfen Sie, ob Ihre Zuordnung für den Primärschlüssel korrekt ist.

Wie sehen Ihre Mapping-XML-Datei oder Ihre Mapping-Anmerkungen aus?

  • Hallo Juha, Sie haben absolut Recht, ich weise dem Benutzerobjekt den Primärschlüssel zu. Vielen dank für Deine Hilfe!

    – gennad

    15. November 2010 um 4:55 Uhr

  • Ich hatte etwas zu irgendeinem Problem. Meine Fehlermeldung enthielt .. wurde von 1 auf 1 geändert .. Mein Primärschlüssel war in meiner Entitätsklasse auf lang gesetzt, wurde aber in meiner Zuordnungsdatei int zugeordnet.

    – Jonas Geiregat

    8. Februar 2012 um 7:46 Uhr

Sie müssen Ihre Entität von der Sitzung trennen, bevor Sie ihre ID-Felder ändern

In meinem Fall war das PK-Feld in hbm.xml vom Typ „Integer“, aber im Bean-Code war es long.

  • Danke, genau das hatte ich (aber dann Int32 statt Int64).

    – Johan Häst

    14. November 2012 um 13:42 Uhr

  • Ich hatte ein ähnliches Problem in Lucee 5: die PK in einer Tabelle war type='numeric' aber das gleiche Feld in einem zusammengesetzten Schlüssel in einer anderen Tabelle hatte das nicht. Hinzufügen type='numeric' zum Feld im zusammengesetzten Schlüssel wurde der Fehler behoben.

    – Dave DuPlantis

    17. April 2018 um 13:54 Uhr

In meinem Fall unterschieden sich Getter- und Setter-Namen vom Variablennamen.

private Long stockId;
    public Long getStockID() {
        return stockId;
    }
    public void setStockID(Long stockID) {
        this.stockId = stockID;
    }

wo es sein soll

public Long getStockId() {
    return stockId;
}
public void setStockId(Long stockID) {
    this.stockId = stockID;
}

In meinem Fall habe ich es gelöst, indem ich den @Id-Feldtyp von long auf Long geändert habe.

Benutzer-Avatar
Ken

Stellen Sie sicher, dass Sie nicht versuchen, dasselbe Benutzerobjekt mehr als einmal zu verwenden, während Sie die ID ändern. Mit anderen Worten, wenn Sie etwas in einer Batch-Operation gemacht haben:

User user = new User();  // Using the same one over and over, won't work
List<Customer> customers = fetchCustomersFromSomeService();
for(Customer customer : customers) {
 // User user = new User(); <-- This would work, you get a new one each time
 user.setId(customer.getId());
 user.setName(customer.getName());
 saveUserToDB(user);
}

Benutzer-Avatar
Ätherisch

In meinem speziellen Fall wurde dies durch eine Methode in meiner Dienstimplementierung verursacht, die die Feder benötigte @Transactional(readOnly = true) Anmerkung. Nachdem ich das hinzugefügt hatte, war das Problem behoben. Ungewöhnlich aber, es war nur eine ausgewählte Aussage.

1018390cookie-checkHibernate: Wie behebt man „Bezeichner einer Instanz geändert von X nach Y“?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy