JPA @ OneToMany - & gt; Eltern-Kind-Referenz (Fremdschlüssel)

ich habe eine Frage zum verweisen auf ParentEntities von Kind Entites ir
Wenn ich etwas wie dieses:

Parent.java:

@Entity(name ="Parent")
public class Parent {
    @Id
    @Generate.....
    @Column
    private int id;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "parent")
    private Set<Child> children;

    simple ... getter and setter ...
}

Und die Child.java:

@Entity(name ="Child")
public class Child{
    @Id
    @Generate....
    @Column
    private int id;

    @ManyToOne
    private Parent parent;

    ... simple getter an setter
}

Werden folgende Tabellen erstellt:

Parent:
     int id

Child:
     int id
     int parent_id (foreign key: parent.id)

Ok, so weit, everthings in Ordnung. Aber wenn es darum geht, mit dieser Referenz von Java, würde ich denken, Sie kann so etwas tun.

 @Transactional
 public void test() {
    Parent parent = new Parent();

    Child child = new Child();
    Set<Child> children = new HashSet<Child>();
    children.add(child);

    parent.setChildren(children);
    entityManager.persist(parent);
  }

führt diese in der Datenbank:

Parent:
     id
     100

Child
     id     paren_id
     101    100

Aber das ist nicht der Fall, Sie müssen ausdrücklich festlegen, dass ein Elternteil das Kind (die, würde ich denken, der Rahmen könnte wohl von selbst tun).

So was ist wirklich in der Datenbank ist diese:

Parent:
     id
     100

Child
     id     paren_id
     101    (null)

Ursache habe ich noch nicht festgelegt, den Eltern auf das Kind. Also meine Frage:

Tun, ich habe wirklich zu tun, sth. wie das?

Parent.java:

...
setChildren(Set<Child> children) {
   for (Child child : children) {
     child.setParent.(this);
   }

   this.children = children;
}
...

Edit:

Nach dem schnellen Antworten, ich war in der Lage, dieses Problem zu lösen, indem Sie mithilfe der @JoinColumn auf die Referenz-Besitzende Entität. Wenn wir das Beispiel von oben nehmen, ich habe sth. wie diese:

Parent.java:

  @Entity(name ="Parent")
    public class Parent {
        @Id
        @Generate.....
        @Column
        private int id;

        @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
        @JoinColumn(name= "paren_id")
        private Set<Child> children;

        simple ... getter and setter ...
    }

Und die Child.java:

@Entity(name ="Child")
public class Child{
    @Id
    @Generate....
    @Column
    private int id;

    ... simple getter an setter
}

Nun, wenn wir dies tun:

 @Transactional
 public void test() {
    Parent parent = new Parent();

    Child child = new Child();
    Set<Child> children = new HashSet<Child>();
    children.add(child);

    parent.setChildren(children);
    entityManager.persist(parent);
  }

Die Referenz ist richtig eingestellt, indem die Eltern:

Parent:
     id
     100

Child
     id     paren_id
     101    100

Danke für die Antworten.

Kommentar zu dem Problem - Öffnen
haben Sie Eltern auf Kind-Einheit? wenn ja, wie Sie konfiguriert ist. Ohne Eltern bekomme ich Fehler(StaleStateException: Batch-update zurückgegeben unerwartete Zeilenanzahl von update [0]; tatsächliche Zeilenanzahl: 0; erwartet: 1). Wenn ich Eltern mit keine Anmerkungen es zeigt Fehler(Mapping-Fehler). Mit der Einstellung @manytoone auf den übergeordneten Bereich der Kinder-ich bekomme Fehler auf speichern( ORA-00904: "REPORT_REPORT_ID": недопустимый идентификатор). mein fk und seine pk auf id namens report_id aber ich weiß nicht, wo kommt report_report_id. Kommentarautor: Erlan
(Mit EclipseLink JPA-Implementierung). Es ist erwähnenswert, müssen Sie noch die @Column(name="paren_id")private long parenId; mapping auf Ihr Kind für diese wot Arbeit. Kommentarautor: AfterWorkGuinness

InformationsquelleAutor der Frage Sim0rn | 2012-03-02

Schreibe einen Kommentar