Ich versuche, diesen grundlegenden JPA / EJB-Code auszuführen:
public static void main(String[] args){
UserBean user = new UserBean();
user.setId(1);
user.setUserName("name1");
user.setPassword("passwd1");
em.persist(user);
}
Ich erhalte diesen Fehler:
javax.ejb.EJBException: javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.JPA.Database
Irgendwelche Ideen?
Ich suche im Internet und der Grund, den ich gefunden habe, war:
Dies wurde dadurch verursacht, wie Sie die Objekte erstellt haben, dh wenn Sie die ID-Eigenschaft explizit festgelegt haben. Das Entfernen der ID-Zuweisung hat das Problem behoben.
Aber ich habe es nicht verstanden. Was muss ich ändern, damit der Code funktioniert?
Der Fehler tritt auf, weil die ID des Objekts festgelegt ist. Der Ruhezustand unterscheidet zwischen vorübergehenden und getrennten Objekten und
persist
funktioniert nur mit vorübergehenden Objekten. Wenn derpersist
Schluss gezogen wird, dass das Objekt getrennt wurde (was der Fall ist, weil die ID festgelegt ist), wird der Fehler "Zum Fortbestehen übergebenes getrenntes Objekt" zurückgegeben. Weitere Details finden Sie hier und hier .Dies gilt jedoch nur, wenn Sie den automatisch zu generierenden Primärschlüssel angegeben haben: Wenn das Feld so konfiguriert ist, dass es immer manuell festgelegt wird, funktioniert Ihr Code.
quelle
entfernen
weil es automatisch in der Datenbank generiert wird, und fahren Sie mit dem Befehl persist fort.
quelle
Ich habe die Antwort bekommen, die ich verwendet habe:
Ich habe Merge anstelle von Persist verwendet:
Aber keine Ahnung, warum persist nicht funktioniert hat. :(
quelle
Wenn Sie die
id = GenerationType.AUTO
Strategie in Ihrer Entität generieren .Ersetzt
user.setId (1)
durchuser.setId (null)
und das Problem ist gelöst.quelle
Ich weiß, dass es zu spät ist und dass jeder die Antwort bekommen hat. Aber noch ein bisschen mehr: Wenn GenerateType festgelegt ist, wird erwartet, dass persist () für ein Objekt eine ID generiert.
Wenn der Benutzer bereits einen Wert für die ID festgelegt hat, wird dieser im Ruhezustand als gespeicherter Datensatz behandelt und daher als getrennt behandelt.
Wenn die ID null ist, wird in dieser Situation eine Nullzeigerausnahme ausgelöst, wenn der Typ AUTO oder IDENTITY usw. ist, es sei denn, die ID wird aus einer Tabelle oder einer Sequenz usw. generiert.
Design: Dies geschieht, wenn die Tabelle eine Bean-Eigenschaft als Primärschlüssel hat. GenerateType darf nur festgelegt werden, wenn eine ID automatisch generiert wird. Wenn Sie dies entfernen, sollte die Einfügung mit der vom Benutzer angegebenen ID funktionieren. (Es ist ein schlechtes Design, eine Eigenschaft dem Primärschlüsselfeld zuzuordnen.)
quelle
Hier wird nur .persist () den Datensatz einfügen. Wenn wir .merge () verwenden , wird überprüft, ob ein Datensatz mit der aktuellen ID vorhanden ist. Wenn er vorhanden ist, wird er aktualisiert, andernfalls wird ein neuer Datensatz eingefügt .
quelle
Wenn Sie in Ihrer Datenbank die ID als Primärschlüssel und automatische Inkrementierung festlegen, ist diese Codezeile falsch:
Versuchen Sie es damit:
quelle
detached entity passed to persist
Ich hatte dieses Problem und es wurde durch den Cache der zweiten Ebene verursacht:
Da der Cache nicht ungültig war, ging der Ruhezustand davon aus, dass es sich um eine getrennte Instanz derselben Entität handelte.
quelle