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 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.
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);
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;
}
}
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();
.
.
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.