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

2voto

Amit Varshney Punkte 21

In meinem Fall war das Problem ganz anders gelagert. Ich habe zwei Klassen, sagen wir c1 & c2. Zwischen C1 und C2 besteht eine OneToMany-Abhängigkeit. Wenn ich nun C1 in der DB speichere, wird der obige Fehler ausgelöst.

Die Lösung dieses Problems bestand darin, zunächst die ID von C2 aus der Verbraucheranforderung abzurufen und C2 über einen Repository-Aufruf zu finden, um dann C2 in C1 zu speichern.

1voto

Jeremy Goodell Punkte 17417

Ein weiterer möglicher Grund: In meinem Fall habe ich versucht, das untergeordnete Element zu speichern, bevor ich das übergeordnete Element gespeichert habe, und zwar auf einer ganz neuen Entität.

Der Code in einem User.java-Modell sah in etwa so aus:

this.lastName = lastName;
this.isAdmin = isAdmin;
this.accountStatus = "Active";
this.setNewPassword(password);
this.timeJoin = new Date();
create();

Die Methode setNewPassword() erstellt einen PasswordHistory-Datensatz und fügt ihn der History-Sammlung in User hinzu. Da die create()-Anweisung für die übergeordnete Entität noch nicht ausgeführt worden war, wurde versucht, in einer Sammlung einer Entität zu speichern, die noch nicht erstellt worden war. Um dies zu beheben, musste ich lediglich den Aufruf setNewPassword() nach dem Aufruf von create() verschieben.

this.lastName = lastName;
this.isAdmin = isAdmin;
this.accountStatus = "Active";
this.timeJoin = new Date();
create();
this.setNewPassword(password);

1voto

Ravindra Punkte 1732

Es gibt so viele Möglichkeiten dieses Fehlers einige andere Möglichkeiten sind auch auf der Seite hinzufügen oder bearbeiten Seite. In meinem Fall habe ich versucht, ein Objekt AdvanceSalary zu speichern. Das Problem ist, dass in bearbeiten die AdvanceSalary employee.employee_id ist null, weil auf bearbeiten ich war nicht die employee.employee_id gesetzt. Ich habe ein verstecktes Feld zu machen und setzen Sie es. mein Code funktioniert absolut gut.

    @Entity(name = "ic_advance_salary")
    @Table(name = "ic_advance_salary")
    public class AdvanceSalary extends BaseDO{

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "id")
        private Integer id;

        @ManyToOne(fetch = FetchType.EAGER)
        @JoinColumn(name = "employee_id", nullable = false)
        private Employee employee;

        @Column(name = "employee_id", insertable=false, updatable=false)
        @NotNull(message="Please enter employee Id")
        private Long employee_id;

        @Column(name = "advance_date")
        @DateTimeFormat(pattern = "dd-MMM-yyyy")
        @NotNull(message="Please enter advance date")
        private Date advance_date;

        @Column(name = "amount")
        @NotNull(message="Please enter Paid Amount")
        private Double amount;

        @Column(name = "cheque_date")
        @DateTimeFormat(pattern = "dd-MMM-yyyy")
        private Date cheque_date;

        @Column(name = "cheque_no")
        private String cheque_no;

        @Column(name = "remarks")
        private String remarks;

        public AdvanceSalary() {
        }

        public AdvanceSalary(Integer advance_salary_id) {
            this.id = advance_salary_id;
        }

        public Integer getId() {
            return id;
        }

        public void setId(Integer id) {
            this.id = id;
        }

        public Employee getEmployee() {
            return employee;
        }

        public void setEmployee(Employee employee) {
            this.employee = employee;
        }

        public Long getEmployee_id() {
            return employee_id;
        }

        public void setEmployee_id(Long employee_id) {
            this.employee_id = employee_id;
        }

    }

1voto

Fall 1: Ich habe diese Ausnahme erhalten, als ich versucht habe, eine übergeordnete Entität zu erstellen und diese übergeordnete Referenz zu ihrem Kind zu speichern und dann eine andere DELETE/UPDATE-Abfrage (JPQL). Also habe ich einfach flush() die neu erstellte Entität nach dem Erstellen von Eltern und nach dem Erstellen von Kind mit dem gleichen Eltern-Referenz. Es funktionierte für mich.

Fall 2:

Übergeordnete Klasse

public class Reference implements Serializable {

    @Id
    @Column(precision=20, scale=0)
    private BigInteger id;

    @Temporal(TemporalType.TIMESTAMP)
    private Date modifiedOn;

    @OneToOne(mappedBy="reference")
    private ReferenceAdditionalDetails refAddDetails;
    . 
    .
    .
}

Klasse Kind:

public class ReferenceAdditionalDetails implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @OneToOne
    @JoinColumn(name="reference",referencedColumnName="id")
    private Reference reference;

    private String preferedSector1;
    private String preferedSector2;
    .
    .

}

Im obigen Fall, wo Elternteil (Reference) und Kind (ReferenceAdditionalDetails) mit OneToOne-Beziehung und wenn Sie versuchen, Referenz Entität und dann sein Kind (ReferenceAdditionalDetails) zu erstellen, wird es Ihnen die gleiche Ausnahme geben. Um diese Ausnahme zu vermeiden, müssen Sie für die untergeordnete Klasse null festlegen und dann die übergeordnete Klasse erstellen (Beispielcode).

.
.
reference.setRefAddDetails(null);
reference = referenceDao.create(reference);
entityManager.flush();
.
.

1voto

Hossein Nasr Punkte 1346

Es gibt noch eine weitere Möglichkeit, die diesen Fehler in Hibernate verursachen kann. Sie können einen ungesicherten Verweis auf Ihr Objekt setzen A zu einer angeschlossenen Einheit B und das Objekt persistieren wollen C . Auch in diesem Fall erhalten Sie den oben erwähnten Fehler.

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