JPA @OneToMany -> Parent - Enfant de Référence (Clé Étrangère)

j'ai une Question sur le référencement ParentEntities de l'Enfant Entités ir
Si j'ai quelque chose comme ceci:

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 ...
}

Et la Child.java:

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

    @ManyToOne
    private Parent parent;

    ... simple getter an setter
}

Tableaux suivants vont être créées:

Parent:
     int id

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

Ok, pour l'instant, everthings amende. Mais quand il vient à l'aide de cette Référence de Java, je pense que vous pouvez faire quelque chose comme cela.

 @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);
  }

ce qui conduit à cette Base de données:

Parent:
     id
     100

Child
     id     paren_id
     101    100

Mais ce n'est pas le cas, vous devez définir explicitement la Mère à l'Enfant (ce qui, je pense, le cadre pourrait probablement faire par lui-même).

Donc ce qui est vraiment dans la base de données est: est-ce

Parent:
     id
     100

Child
     id     paren_id
     101    (null)

parce que je n'ai pas le Parent de l'Enfant. Donc ma Question:

Dois-je vraiment faire qqch. comme cette?

Parent.java:

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

   this.children = children;
}
...

Edit:

Selon les Réponses rapides, j'ai pu résoudre ce Problème en utilisant les annotations @JoinColumn sur la Référence-Entité Propriétaire. Si nous prenons l'Exemple ci-dessus, j'ai fait qqch. comme ceci:

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 ...
    }

Et la Child.java:

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

    ... simple getter an setter
}

Maintenant, si nous faisons cela:

 @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);
  }

La Référence est correctement réglée par le Parent:

Parent:
     id
     100

Child
     id     paren_id
     101    100

Merci pour les Réponses.

  • avez-vous parent de l'enfant entité? si oui, comment ils sont configurés. Avec aucun parent j'obtiens l'erreur(StaleStateException: mise à jour par Lot retourné inattendue du nombre de lignes de mise à jour [0]; un nombre de lignes: 0; attendu: 1). Si j'ai ajouter un parent sans annotations, il affiche erreur(erreur de Cartographie). Avec le paramètre @manytoone sur le champ parent de l'enfant, j'obtiens le message d'erreur sur save( ORA-00904: "REPORT_REPORT_ID": недопустимый идентификатор). mon fk et son pk id nommé report_id mais je ne sais pas d'où vient report_report_id.
  • (À l'aide d'EclipseLink implémentation JPA). Il est intéressant de noter que vous avez toujours besoin de l' @Column(name="paren_id")private long parenId; la cartographie de votre enfant pour cette wot travail.
InformationsquelleAutor Sim0rn | 2012-03-02