Rời "uni-directional" dành cho thời điểm này, người ta có thể mô hình hóa một mối quan hệ khách hàng đặt hàng như sau.
@Entity
public class Customer {
// ...
@Id @GeneratedValue
int id;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "customer")
Set<Order> orders;
// ...
}
@Entity
public class Order {
// ...
@ManyToOne(optional = false)
Customer customer;
// ...
}
Ở đây tôi giả định rằng mỗi Đơn hàng có chính xác một Khách hàng. Trong cơ sở dữ liệu, bảng thứ tự sẽ có cột "customer_id" với khóa ngoài vào cột "id" của bảng Khách hàng. DDL sẽ trông giống như sau.
CREATE TABLE Customer (
id INT NOT NULL,
...
PRIMARY KEY (id)
);
CREATE TABLE Order (
...
customer_id INT NOT NULL,
...
FOREIGN KEY (customer_id) REFERENCES Customer (id)
);
Mặc dù lớp Khách hàng chứa tập hợp đơn đặt hàng, điều này thực sự không ảnh hưởng đến cấu trúc cơ sở dữ liệu; nó chỉ là một cách thuận tiện để lấy/quản lý các đơn đặt hàng thuộc về khách hàng. Ví dụ: bạn có thể bỏ toàn bộ thành viên "đơn đặt hàng" khỏi Khách hàng và dựa vào các truy vấn để tìm nạp các bản ghi này thay thế.
Điểm tôi đang cố gắng thực hiện là, từ góc nhìn của cơ sở dữ liệu , thực sự không có mối quan hệ nào "như một hướng". Ví dụ reverendgreen được cung cấp sẽ tạo ra các lớp Java khi không có cách trực tiếp để nhận đối tượng khách hàng từ đối tượng Order, nhưng cấu trúc cơ sở dữ liệu sẽ giống nhau (bỏ qua các khác biệt nhỏ trong tên cột). Bạn luôn có thể tìm thấy khách hàng cho một đơn đặt hàng cụ thể bằng truy vấn.
Nguồn
2010-08-18 20:40:13
Lưu ý rằng JPA 1.0 không ** không ** hỗ trợ một chiều mối quan hệ 'OneToMany' ** mà không có ** một 'Tham số'. Nói cách khác, bạn không thể ánh xạ mô hình bảng trên bằng một 'OneToMany' đơn hướng và do đó nó không minh họa chính xác câu trả lời của bạn. –
Pascal là chính xác. Ví dụ trên chỉ hoạt động với JPA 2.0. –
@JoinColumn (name = "cust_id", referencedColumnName = "owner_id") là đúng? – uuidcode