911 Stimmen

Behebung des Hibernate-Fehlers "Objekt verweist auf eine nicht gespeicherte transiente Instanz - speichern Sie die transiente Instanz vor dem Flushen".

Ich erhalte folgenden Fehler, wenn ich das Objekt mit Hibernate speichere

object references an unsaved transient instance - save the transient instance before flushing

34voto

allap Punkte 599

In meinem Fall wurde es dadurch verursacht, dass ich keine CascadeType über die @ManyToOne Seite der bidirektionalen Beziehung. Um genauer zu sein, hatte ich CascadeType.ALL auf @OneToMany Seite und hatte sie nicht an @ManyToOne . Hinzufügen von CascadeType.ALL まで @ManyToOne das Problem behoben. Eins-zu-viele Seite:

@OneToMany(cascade = CascadeType.ALL, mappedBy="globalConfig", orphanRemoval = true)
private Set<GlobalConfigScope>gcScopeSet;

Viele-zu-eins-Seite (verursachte das Problem)

@ManyToOne
@JoinColumn(name="global_config_id")
private GlobalConfig globalConfig;

Viele-zu-eins (behoben durch Hinzufügen von CascadeType.PERSIST )

@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name="global_config_id")
private GlobalConfig globalConfig;

23voto

dukethrash Punkte 1400

Dies trat bei mir auf, als ich eine Entität persistierte, bei der der vorhandene Datensatz in der Datenbank einen NULL-Wert für das mit @Version (für optimistisches Sperren) kommentierte Feld hatte. Durch Aktualisieren des NULL-Wertes auf 0 in der Datenbank wurde dies korrigiert.

14voto

Tiina Punkte 3505

Verwenden Sie nicht Cascade.All bis Sie es wirklich müssen. Role et Permission haben bidirektionale manyToMany Beziehung. Dann würde der folgende Code gut funktionieren

    Permission p = new Permission();
    p.setName("help");
    Permission p2 = new Permission();
    p2.setName("self_info");
    p = (Permission)crudRepository.save(p); // returned p has id filled in.
    p2 = (Permission)crudRepository.save(p2); // so does p2.
    Role role = new Role();
    role.setAvailable(true);
    role.setDescription("a test role");
    role.setRole("admin");
    List<Permission> pList = new ArrayList<Permission>();
    pList.add(p);
    pList.add(p2);
    role.setPermissions(pList);
    crudRepository.save(role);

wenn das Objekt nur ein "neues" Objekt ist, würde derselbe Fehler auftreten.

13voto

nanospeck Punkte 3088

Dies ist nicht der einzige Grund für den Fehler. Ich stieß gerade jetzt für einen Tippfehler in meiner Kodierung, die ich glaube, setzen einen Wert einer Entität, die bereits gespeichert wurde.

X x2 = new X();
x.setXid(memberid); // Error happened here - x was a previous global entity I created earlier
Y.setX(x2);

Ich habe den Fehler entdeckt, indem ich genau herausgefunden habe, welche Variable den Fehler verursacht hat (in diesem Fall String xid ). Ich habe eine catch um den gesamten Codeblock, der die Entität speichert und die Spuren ausgibt.

{
   code block that performed the operation
} catch (Exception e) {
   e.printStackTrace(); // put a break-point here and inspect the 'e'
   return ERROR;
}

10voto

Hossein Nasr Punkte 1346

Neben allen anderen guten Antworten, könnte dies passieren, wenn Sie merge ein Objekt zu persistieren und versehentlich zu vergessen, die zusammengefasste Referenz des Objekts in der übergeordneten Klasse zu verwenden.

merge(A);
B.setA(A);
persist(B);

In diesem Fall verschmelzen Sie A aber vergessen, das zusammengefasste Objekt von A . um das Problem zu lösen, müssen Sie den Code wie folgt umschreiben.

A=merge(A);//difference is here
B.setA(A);
persist(B);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X