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.

War es hilfreich?

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 FieldChangeentities, 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:

  1. Entfernen NOT NULL auf Fremdschlüssel in der untergeordneten Entität
  2. Verwenden Sie bidirektionale Beziehung
  3. Ä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")
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top