我有一个关于从子实体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)
因为我还没有把父母定为孩子。所以我的问题:
我真的必须做某事吗? 像这样?
... setChildren(Set<Child> children) { for (Child child : children) { child.setParent.(this); } this.children = children; } ...
编辑:
根据快速答复,我能够通过使用引用拥有实体上的@JoinColumn解决此问题。如果我们从上面举这个例子,我确实做了。像这样:
@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 ... }
@Entity(name ="Child") public class Child{ @Id @Generate.... @Column private int id; ... simple getter an setter }
现在,如果我们这样做:
家长正确设置了参考:
感谢您的答案。
我真的必须做某事吗?像这样?
那是一种策略,是的。
在双向关系中,关系具有“拥有”和“非拥有”的一面。由于您的情况下的拥有方是on Child,因此您需要在此处设置关系以使其持久。拥有方通常由您指定的位置确定@JoinColumn,但看起来好像您在使用该注释,因此很可能是从您mappedBy在Parent注释中使用的事实推断出来的。
Child
@JoinColumn
mappedBy
Parent
您可以在此处了解更多信息。