У меня есть вопрос по поводу ссылки на ParentEntities из дочерних объектов ir
Если у меня есть что-то вроде этого:
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 ...
}
И Дитя.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 на Child (что, я думаю, каркас мог бы сделать сам).
Итак, что на самом деле в базе данных это:
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;
}
...
Edit:
Согласно быстрым ответам, я смог решить эту проблему с помощью @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 ...
}
И Дитя.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
Спасибо за ответы.