一尘不染

JPA @OneToMany->父级-子级参考(外键)

hibernate

我有一个关于从子实体ir引用ParentEntities的问题,如果我有这样的事情:

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

和Child.java:

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

    @ManyToOne
    private Parent parent;

    ... simple getter an setter
}

将创建以下表:

Parent:
     int id

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

好的,到目前为止,一切都很好。但是,当涉及到使用Java的Reference时,我想,您可以做这样的事情。

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

这导致在数据库中:

Parent:
     id
     100

Child
     id     paren_id
     101    100

但是事实并非如此,您必须明确地将“父级”设置为“子级”(我认为框架可能可以单独执行)。

因此,数据库中真正是什么:

Parent:
     id
     100

Child
     id     paren_id
     101    (null)

因为我还没有把父母定为孩子。所以我的问题:

我真的必须做某事吗? 像这样?

Parent.java:

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

   this.children = children;
}
...

编辑:

根据快速答复,我能够通过使用引用拥有实体上的@JoinColumn解决此问题。如果我们从上面举这个例子,我确实做了。像这样:

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

和Child.java:

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

    ... simple getter an setter
}

现在,如果我们这样做:

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

家长正确设置了参考:

Parent:
     id
     100

Child
     id     paren_id
     101    100

感谢您的答案。


阅读 418

收藏
2020-06-20

共1个答案

一尘不染

我真的必须做某事吗?像这样?

那是一种策略,是的。

在双向关系中,关系具有“拥有”和“非拥有”的一面。由于您的情况下的拥有方是on
Child,因此您需要在此处设置关系以使其持久。拥有方通常由您指定的位置确定@JoinColumn,但看起来好像您在使用该注释,因此很可能是从您mappedByParent注释中使用的事实推断出来的。

您可以在此处了解更多信息

2020-06-20