tôi có một câu hỏi về tham khảo ParentEntities từ Child entites ir Nếu tôi có một cái gì đó như thế này:JPA @OneToMany -> mẹ - Reference Child (khoá ngoại)
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 ...
}
và Child.java:
@Entity(name ="Child")
public class Child{
@Id
@Generate....
@Column
private int id;
@ManyToOne
private Parent parent;
... simple getter an setter
}
Bàn Dưới đây là sẽ được tạo:
Parent:
int id
Child:
int id
int parent_id (foreign key: parent.id)
Ok, cho đến nay, mọi thứ vẫn ổn. Nhưng khi nói đến việc sử dụng tài liệu tham khảo này từ Java, tôi sẽ nghĩ, bạn có thể làm một cái gì đó như thế này.
@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);
}
dẫn đến điều này trong cơ sở dữ liệu:
Parent:
id
100
Child
id paren_id
101 100
Nhưng thats không phải là trường hợp, bạn phải explicity thiết Phụ Huynh cho trẻ em (trong đó, tôi sẽ nghĩ, khuôn khổ có thể có thể làm bằng cách chinh no).
Vì vậy, whats thực sự trong cơ sở dữ liệu là:
Parent:
id
100
Child
id paren_id
101 (null)
nguyên nhân tôi đã không được thiết lập Phụ Huynh cho trẻ em. Vì vậy, Câu hỏi của tôi:
Tôi có thực sự phải làm sth hay không. như thế này?
Parent.java:
...
setChildren(Set<Child> children) {
for (Child child : children) {
child.setParent.(this);
}
this.children = children;
}
...
Edit:
Theo nhanh Trả lời tôi đã có thể để giải quyết vấn đề này bằng cách sử dụng các @JoinColumn trên Entity Reference-Sở hữu. Nếu chúng ta lấy ví dụ từ trên, tôi đã làm sth. như thế này:
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 ...
}
Và Child.java:
@Entity(name ="Child")
public class Child{
@Id
@Generate....
@Column
private int id;
... simple getter an setter
}
Bây giờ nếu chúng ta làm điều này:
@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);
}
Các tham chiếu được thiết lập một cách chính xác bởi Cha mẹ:
Parent:
id
100
Child
id paren_id
101 100
Cảm ơn câu trả lời.
** bạn có cha mẹ trên thực thể con không? ** nếu có cách chúng được định cấu hình.Không có cha mẹ tôi nhận được lỗi (_StaleStateException: Cập nhật hàng loạt trả về số hàng không mong đợi từ bản cập nhật [0]; số hàng thực tế: 0; dự kiến: 1_). Nếu tôi thêm phụ huynh không có chú thích, nó cũng hiển thị lỗi (Lỗi ánh xạ). Với cài đặt @manytoone trên trường cha mẹ của con, tôi gặp lỗi khi lưu (_ORA-00904: "REPORT_REPORT_ID": недопустимый идентификатор_). fk của tôi và pk của nó trên id có tên report_id nhưng tôi không biết nơi report_report_id đến. – Erlan
(Sử dụng EclipseLink JPA thực hiện). Cần lưu ý rằng bạn vẫn cần parenId dài @Column (name = "paren_id"); lập bản đồ cho con của bạn cho công việc này. – AfterWorkGuinness