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

8voto

Balazs Szanto Punkte 61

Es kann auch passieren, wenn Sie eine OneToMany-Beziehung haben und versuchen, die untergeordnete Entität zur Liste der übergeordneten Entität hinzuzufügen. abrufen. diese Liste durch die übergeordnete Entität (vor dem Speichern dieser übergeordneten Entität), ohne Speicherung der untergeordneten Entität selbst, z.B.:

Child childEntity = new Child();
parentEntity.addChild(childEntity);
parentEntity.getChildren(); // I needed the retrieval for logging, but one may need it for other reasons.
parentRepository.save(parentEntity);

Der Fehler wurde ausgelöst, als ich die übergeordnete Entität gespeichert habe. Wenn ich den Abruf in der vorherigen Zeile entfernt habe, wurde der Fehler nicht ausgelöst, aber das ist natürlich nicht die Lösung.

Le site Lösung die ChildEntity gespeichert hat und Hinzufügen von dass gespeicherte untergeordnete Entität an die übergeordnete Entität, etwa so:

Child childEntity = new Child();
Child savedChildEntity = childRepository.save(childEntity);
parentEntity.addChild(savedChildEntity);
parentEntity.getChildren();
parentRepository.save(parentEntity);

7voto

Joabe Lucena Punkte 739

Wenn Ihre Sammlung nullbar ist, versuchen Sie es einfach: object.SetYouColection(null);

7voto

mad_fox Punkte 2810

Dieses Problem trat bei mir auf, als ich eine neue Entität und eine zugehörige Entität in einer Methode erstellte, die als @Transactional und führte dann vor dem Speichern eine Abfrage durch. Bsp.

@Transactional
public someService() {
    Entity someEntity = new Entity();
    AssocaiatedEntity associatedEntity = new AssocaitedEntity();
    someEntity.setAssociatedEntity(associatedEntity);
    associatedEntity.setEntity(someEntity);

    // Performing any query was causing hibernate to attempt to persist the new entity. It would then throw an exception
    someDao.getSomething();

    entityDao.create(someEntity);
}

Um dies zu beheben, habe ich die Abfrage vor der Erstellung der neuen Entität durchgeführt.

6voto

manikanta Punkte 7272

Um meine 2 Cents hinzuzufügen, ich habe das gleiche Problem, wenn ich versehentlich senden null als die ID. Der nachstehende Code zeigt mein Szenario (und der Auftraggeber hat kein bestimmtes Szenario erwähnt) .

Employee emp = new Employee();
emp.setDept(new Dept(deptId)); // --> when deptId PKID is null, same error will be thrown
// calls to other setters...
em.persist(emp);

Hier bin ich Einstellung der vorhandenen Abteilung id zu einem neuen Mitarbeiter Instanz ohne tatsächlich die Abteilung Entität zuerst, wie ich nicht eine weitere Select-Abfrage zu feuern wollen.

In einigen Szenarien, deptId PKID kommt als null von der aufrufenden Methode und ich m erhalten den gleichen Fehler.

Also, achten Sie auf null Werte für PK ID

4voto

DevWithSigns Punkte 715

Wenn Sie Spring Data JPA verwenden, fügen Sie @Transactional Anmerkung zu Ihrer Dienstimplementierung würde das Problem lösen.

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