Ich erhalte folgenden Fehler, wenn ich das Objekt mit Hibernate speichere
object references an unsaved transient instance - save the transient instance before flushing
Ich erhalte folgenden Fehler, wenn ich das Objekt mit Hibernate speichere
object references an unsaved transient instance - save the transient instance before flushing
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;
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.
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;
}
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 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.