JPA @OneToMany -> 父项 - 子引用(外键)
2022-09-01 00:39:49
我有一个关于引用来自儿童Entites ir的Parententities的问题,如果我有这样的东西:
家长.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 ...
}
孩子.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的这个参考时,我认为,你可以做这样的事情。
@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)
因为我没有设置父母到孩子。所以我的问题:
我真的必须做sth吗?喜欢这个?
家长.java:
...
setChildren(Set<Child> children) {
for (Child child : children) {
child.setParent.(this);
}
this.children = children;
}
...
编辑:
根据快速回复,我能够通过使用引用拥有实体上的@JoinColumn来解决此问题。如果我们从上面取例子,我做了sth。喜欢这个:
家长.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 ...
}
孩子.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