2010-04-10 41 views
6

Q 1) Làm thế nào chúng ta có thể mô hình hóa mối quan hệ bậc ba bằng cách sử dụng Hibernate? Ví dụ, làm thế nào chúng ta có thể mô hình mối quan hệ ternary trình bày here bằng cách sử dụng Hibernate (hoặc JPA)?Mối quan hệ Ternary (và n-ary) trong Hibernate

LƯU Ý: Tôi biết rằng JPA 2 đã thêm một số cấu trúc để xây dựng mối quan hệ ba bên bằng cách sử dụng bản đồ. Tuy nhiên, câu hỏi này giả định JPA 1 hoặc Hibernate 3.3.x và tôi không thích sử dụng bản đồ để mô hình hóa điều này.

ER Model http://db.grussell.org/co22001%20notes_files/image043.gif


ER Model with ternary relationships replaced http://db.grussell.org/co22001%20notes_files/image045.gif

Lý tưởng nhất là tôi thích mô hình của tôi là như thế này:

class SaleAssistant { 
Long id; 
//... 
} 

class Customer { 
Long id; 
//... 
} 

class Product { 
Long id; 
//... 
} 

class Sale { 
SalesAssistant soldBy; 
Customer buyer; 
Product product; 
//... 
} 

Q 1.1)

Làm thế nào chúng ta có thể mô hình biến thể này, trong đó mỗi mặt hàng bán có thể có nhiều sản phẩm?

class SaleAssistant { 
Long id; 
//... 
} 

class Customer { 
Long id; 
//... 
} 

class Product { 
Long id; 
//... 
} 

class Sale { 
SalesAssistant soldBy; 
Customer buyer; 
Set<Product> products; 
//... 
} 

Q 2) Nói chung, làm thế nào chúng ta có thể mô hình n-ary, n> = 3 mối quan hệ với Hibernate?

Xin cảm ơn trước.

Trả lời

11

Q1. Làm thế nào chúng ta có thể mô hình hóa một mối quan hệ ternary bằng cách sử dụng Hibernate? Ví dụ, làm thế nào chúng ta có thể mô hình mối quan hệ ternary trình bày ở đây bằng cách sử dụng Hibernate (hoặc JPA)? (...)

Tôi sẽ sửa lại liên kết với lớp thực thể trung gian (và đó là cách được khuyến nghị với Hibernate). Áp dụng cho ví dụ của bạn:

@Entity 
public class Sale { 
    @Embeddable 
    public static class Pk implements Serializable { 
     @Column(nullable = false, updatable = false) 
     private Long soldById; 

     @Column(nullable = false, updatable = false) 
     private Long buyerId; 

     @Column(nullable = false, updatable = false) 
     private Long productId; 

     public Pk() {} 

     public Pk(Long soldById, Long buyerId, Long productId) { ... } 

     // getters, setters, equals, hashCode 
    } 

    @EmbeddedId 
    private Pk pk; 

    @ManyToOne 
    @JoinColumn(name = "SOLDBYID", insertable = false, updatable = false) 
    private SaleAssistant soldBy; 
    @ManyToOne 
    @JoinColumn(name = "BUYERID", insertable = false, updatable = false) 
    private Customer buyer; 
    @ManyToOne 
    @JoinColumn(name = "PRODUCTID", insertable = false, updatable = false) 
    private Product product; 

    // getters, setters, equals, hashCode 
} 

Q1.1. Làm cách nào chúng tôi có thể lập mô hình biến thể này, trong đó mỗi mặt hàng Bán có thể có nhiều Sản phẩm?

Tôi sẽ không sử dụng khóa chính kết hợp ở đây và giới thiệu PK cho thực thể Sale.

Q2. Nói chung, làm thế nào chúng ta có thể mô hình n-ary, n> = 3 mối quan hệ với Hibernate?

Tôi nghĩ câu trả lời của tôi cho Q1. bao gồm điều này. Nếu không, vui lòng làm rõ.


Cập nhật: ý kiến ​​trả lời từ OP

(...) các lĩnh vực của vn không nhận được dân cư và kết quả là tôi không thể lưu các mặt hàng bán trong DB. Tôi có nên sử dụng những người định cư như thế này cho lớp Bán hàng không? public void setBuyer (Giữ khách hàng) {this.buyer = cust; this.pk.buyerId = cust.getId(); }

Bạn cần phải tạo ra một mới Pk (Tôi đã gỡ bỏ các nhà thầu từ câu trả lời ban đầu của tôi cho conciseness) và thiết lập nó trên Sale mục. Tôi sẽ làm một việc như sau:

Sale sale = new Sale(); 
Pk pk = new Pk(saleAssistant.getId(), customer.getId(), product.getId()); 
sale.setPk(pk); 
sale.setSoldBy(saleAssistant); 
sale.setBuyer(customer); 
sale.setProduct(product); 
... 

Và sau đó giữ nguyên sale.

Ngoài ra, trong chú thích JoinColumn, cột "tên" là gì? Các pks quan hệ đích hoặc tên cột của bảng bán hàng?

Để các cột cho các thuộc tính của hỗn Pk (ví dụ: tên cột riêng bảng bán), chúng tôi muốn họ có được PK và FK ràng buộc.

+0

Cảm ơn bạn đã phản hồi. Nhưng tôi gặp phải một vấn đề khi tôi sử dụng điều này: các lĩnh vực của pk không nhận được dân cư và kết quả là tôi không thể lưu các mặt hàng Bán trong DB. Tôi có nên sử dụng những người định cư như thế này cho lớp học Bán hàng không? bộ công khai void (Người mua hàng) { this.buyer = cust; this.pk.buyerId = cust.getId(); } Ngoài ra, trong chú thích JoinColumn, cột "tên" là gì? Các pks quan hệ đích hoặc tên cột của bảng bán hàng? – Behrang

0

Bạn có đang sử dụng khóa cơ sở dữ liệu được tạo cho Khách hàng, Sản phẩm và Người bán hàng không? Điều đó có thể gây ra một vấn đề vì có vẻ như bạn đang cố gắng sử dụng các định danh DB thực tế thay vì để Hibernate giải quyết các tham chiếu đối tượng trong suốt thời gian tồn tại thực tế.

PK được nhúng ở trên trông kỳ quặc với cá nhân tôi nhưng tôi không có cơ hội dùng thử. Có vẻ như các cột chồng chéo và đan xen lẫn nhau.

Tôi nghĩ sẽ đủ để chỉ có tham chiếu ManyToOne.

Ngoài ra, hãy bật gỡ lỗi câu lệnh SQL và xem nội dung đang được gửi tới DB.

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