2016-08-09 186 views
3

Durch SO gesucht, aber sieht aus, als gäbe es keinen ähnlichen Fall.Frühling jpa - ein anderes Objekt mit dem gleichen Identifier-Wert war bereits mit der Sitzung verbunden

Es ist ein Unternehmen, Land, mit einem einzigen Feld:

public class Country { 

    @Id 
    @Column(name = "COUNTRY_CODE") 
    private String countryCode; 

    public boolean equals(Object o) {} 

    public int hashCode() { } 
} 

Und eine andere Klasse, die eine Sammlung dieser Einträge hat:

public class Product { 

    @ManyToOne(fetch = EAGER, cascade = ALL) 
    @JoinColumn(name = "COUNTRY_CODE") 
    private Country country; 
} 

Wenn Land durch Einstellung:

product.setCountry(new Country("lv")) 

Ich nehme an, dass es nur gespeichert wird, wenn es vorhanden ist.

Aber stattdessen erhalte ich eine Ausnahme - ein anderes Objekt mit dem gleichen Kennungswert wurde bereits mit der Sitzung verknüpft

+0

Können Sie den StackTrace bitte anzeigen? – ryekayo

Antwort

8

Mit so viel Code Sehen Sie diese Arten von Problemen zur Verfügung gestellt haben kommt, da die Objekte sind nicht auf das vorlegende gleiche Java-Objektinstanz. Dies kann passieren, wenn Sie das gleiche Sitzungsobjekt zum Lesen verwendet haben & schreiben Oder wenn Sie dasselbe Objekt in einer einzigen Sitzung setzen. Sie beziehen sich auf die gleiche Zeile in der Datenbank (dh den gleichen Primärschlüssel), aber sie sind andere Kopien davon. Also, was passiert, ist, dass die Sitzung, die die Entitäten verwaltet, verfolgen würde, welches Java-Objekt entspricht die Zeile mit dem gleichen Primärschlüssel.

Ich würde Ihnen empfehlen, unten angegebenen Code zu versuchen.

1- Just set cascade to MERGE, that should work for you. 

     OR 

2- @GeneratedValue(strategy = GenerationType.SEQUENCE) OR Other GenerationType 
+1

das hat funktioniert - @ManyToOne (cascade = {PERSIST, MERGE}) – sandris