One-to-Many unidirektional Eltern-Kind-ID Cascade speichern
-
18-09-2019 - |
Frage
Beim Versuch, eine ID von meiner Elternklasse in eine untergeordneten Klasse zu speichern, ich erhalte den Fehler „ERROR - Feld‚parent_id‘keinen Standardwert hat“
Ich habe alle Arten von Zuordnungen versucht. Ich bin mit Anmerkungen.
Jede Hilfe auf diesem würde geschätzt
Parent:
@Id
@Column(name="id")
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;
@Column(name="description")
private String description;
@OneToMany
@Cascade(value= {org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE})
@JoinColumn(name="parent_id")
private List<Child> children;
Child:
@Id
@Column(name="id")
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;
@Column(name="description")
private String description;
Danke.
Lösung
Sie müssen etwas falsch woanders haben, weil diese Zuordnungen, wie sie sind funktionieren. Sie könnte besser sein, aber sie werden arbeiten. Insbesondere alle @Column
Anmerkungen sind überflüssig und unnötig, und als nicht Sequitor erwähnt, sollten Sie die Kaskade Eigentum der PPV-@OneToMany
statt Hibernate @Cascade
verwenden. Ich habe eine mit der aufgeräumte Version von dem, was Sie auf dem Laufenden. Wenn Sie git und Maven haben, können Sie führen Sie es mit:
git clone git://github.com/zzantozz/testbed tmp
cd tmp
mvn -q compile exec:java \
-Dexec.mainClass=rds.hibernate.UnidirectionalManyToOneJoinColumn \
-pl hibernate-unidirectional-one-to-many-with-join-column
Es schafft einen Elternteil mit zwei Kindern, speichert sie und lädt sie dann und die Grafik ausdruckt. Die Ausgabe lautet:
Creating parent with two children
Loading saved parent
Parent{description='parent', children=[Child{description='child 2'}, Child{description='child 1'}]}
Andere Tipps
Eine späte Zugabe falls jemand jemals läuft in der gleichen Ausgabe.
Diese Einheit hier, wenn beharren mit Hibernate 4.1.8, wird Kaskade der FieldChange
entities, aber nicht füllt die Joinspalte:
@Entity
public class Event {
//ID and other fields here
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "event_id")
private List<FieldChange<?>> fields = new ArrayList<FieldChange<?>>();
}
Auch nicht die Insert-Anweisung der event_id
Spalt, noch die eingesetzte Einheit nach der Tat nicht aktualisiert - die event_id
bleibt null und die Beziehung verloren.
Wenn jedoch die @JoinColumn
Definition wird wie folgt geändert:
@JoinColumn(name = "event_id", nullable = false)
, dann die Insert-Anweisung enthält die event_id
Spalte, wie es sollte, und alles ist gut.
Dies kann nur eine Regression in dieser speziellen Version von Hibernate, aber vielleicht hilft es jemand.
In Ihrem Fall JPA-Provider untergeordnetes Objekt mit seinen Eltern beharren ausführt mindestens drei Anfragen zu db. Die ersten beiden bestehen die Objekte durch ihre eigene. Der Letzte Kind-Objekt mit dem Fremdschlüssel Referenzierung Eltern aktualisieren. Die zweite Abfrage fehlschlagen, weil Sie eine NOT NULL-Einschränkung für die Fremdschlüsselspalte haben. Sie haben drei Möglichkeiten:
- Entfernen NOT NULL auf Fremdschlüssel in der untergeordneten Entität
- Verwenden Sie bidirektionale Beziehung
- Ändern JPA-Provider ein, die solche Fälle unterstützt.
Ändern Sie Ihre @OneToMany
PPV @OneToMany(cascade=CascadeType.ALL)
verwenden, anstatt die Hibernate-Erweiterungen
Meine Vermutung ist, dass der @JoinColumn annotation
zugewiesen einen referencedColumnName
muss.
@JoinColumn(name = "parent_id", referencedColumnName = "id")