2010-08-18 51 views
6

Làm thế nào để thực hiện mối quan hệ một chiều trong EJB 3.0 Thực thể-đậu (JPA)?Mối quan hệ một chiều trong thực thể-đậu (JPA)

Ví dụ: Khách hàng biết về Đơn đặt hàng nhưng Đơn hàng không có bất kỳ phương pháp nào cho Khách hàng. sử dụng (@OneToMany hoặc @OneToOne hoặc @ManyToMany)

Trân

Trả lời

15

Đây là cách bạn muốn tạo ra một mối quan hệ một chiều @OneToMany sử dụng JPA 2.0:

@Entity 
public class Customer { 
    @Id 
    @Column(name="cust_id") 
    private long id; 
    ... 
    @OneToMany 
    @JoinColumn(name="owner_id", referencedColumnName="cust_id") 
    private List<Order> order; 
    ... 
} 

@Entity 
public class Order { 
    @Id 
    @Column(name="order_id") 
    private long id; 
    ... 
} 

cơ sở dữ liệu quan hệ:

Khách hàng:

+---------+---------+------+-----+---------+-------+ 
| Field | Type | Null | Key | Default | Extra | 
+---------+---------+------+-----+---------+-------+ 
| cust_id | int(11) | NO | PRI | NULL |  | 
+---------+---------+------+-----+---------+-------+ 

thứ tự:

+----------+---------+------+-----+---------+-------+ 
| Field | Type | Null | Key | Default | Extra | 
+----------+---------+------+-----+---------+-------+ 
| order_id | int(11) | NO | PRI | NULL |  | 
| owner_id | int(11) | NO | MUL | NULL |  | 
+----------+---------+------+-----+---------+-------+ 
+3

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. –

+0

Pascal là chính xác. Ví dụ trên chỉ hoạt động với JPA 2.0. –

+0

@JoinColumn (name = "cust_id", referencedColumnName = "owner_id") là đúng? – uuidcode

1

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.

+0

Như tôi đã viết trong bình luận của tôi, cấu trúc cơ sở dữ liệu kết quả ** sẽ không ** giống hệt với JPA 1.0, JPA 1.0 cần một 'JoinTable' để biểu diễn một OneToMany' đơn hướng. –

+0

Sau khi đọc câu trả lời của bạn, tôi đã cập nhật một số thực thể trong một dự án mà tôi đang làm việc để sử dụng đánh dấu bạn đã đề cập trong ví dụ của bạn. Nó hoạt động tốt - cấu trúc cơ sở dữ liệu giống nhau và các lớp con không chứa tham chiếu trực tiếp đến lớp cha. Tôi không cần chú thích @JoinTable. Phụ thuộc như sau: hibernate-chú thích 3.4.0.GA, hibernate-commons-chú thích 3.1.0.GA, hibernate-core 3.3.2.GA, hibernate-entitymanager 3.4.0.GA, persistence-api 1.0. Đây có phải chỉ là một trường hợp Hibernate vượt quá thông số kỹ thuật JPA 1.0 không? –

+0

Vâng, chính xác, đây là Hibernate cụ thể, 'JoinColumn' không được phép trên' OneToOne' trong ** standard ** JPA 1.0.Tôi đã cung cấp các tham chiếu có liên quan trong [@OneToMany mà không có mối quan hệ nghịch đảo và không có bảng tham gia?] (Http://stackoverflow.com/questions/2095998/onetomany-without-inverse-relationship-and-without-a-join-table/3517474 # 3517474) –

Các vấn đề liên quan