2010-09-21 28 views
6

Tôi có câu hỏi về ánh xạ Hibernate ManyToMany. Tôi có hai lớp A và B và các ánh xạ giữa họ là một ánh xạ ManyToMany giải quyết bằng Hibernate:Cách thêm Khóa chính riêng vào Bảng Tham gia trong Hibernate

@Entity 
@Table(name="A") 
public class A { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @ManyToMany 
    @JoinTable(name="C", [email protected](name="a_id"), [email protected](name="b_id")) 
    private Set bs; 
} 

@Entity 
@Table(name="B") 
public class B { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @ManyToMany(mappedBy="bs") 
    private Set bs; 
} 

Như bạn có thể thấy, Tham Bảng I sử dụng là C. Các phím nước ngoài đến A và B là "a_id "và" b_id ". Hiểu biết của tôi là, Hibernate tạo Khóa chính được tạo bằng a_id và b_id cho bảng C.

Tôi không muốn có một thực thể C trong mô hình của mình. Nhưng thay vì khóa chính được soạn thảo trên bảng C, tôi muốn có một ID được tạo và ràng buộc duy nhất trên các trường a_id và b_id.

Có thể bảo Hibernate sử dụng khóa chính riêng biệt không? Mà không cần thêm một thực thể C?

Tôi sẽ đánh giá cao bất kỳ trợ giúp nào.

Cảm ơn rất nhiều!

Trả lời

1

Tôi không nghĩ điều đó là có thể. Và tôi không thấy một vấn đề trong việc xác định một thực thể C.

Nếu bạn có bất kỳ thông tin bổ sung nào trong bảng tham gia, bạn sẽ không thể truy cập thông tin này bởi vì Set của bạn chứa đối tượng mục tiêu - A hoặc B.

Ngoài ra, Set s của bạn sẽ tận dụng tốt hơn các generics - nghĩa là Set<A>Set<B>.

Btw, Hibernate có thể không được cảnh báo bởi thực tế là bảng tạo một thực thể khác - sử dụng ánh xạ hiện tại của bạn có thể hoạt động (bỏ qua cột id hoàn toàn). Khi bạn nói "Hibernate tạo", tôi giả sử bạn đang tạo lược đồ của bạn từ mô hình thực thể của bạn. Bây giờ có vẻ như nó ngược lại, vì vậy hãy thử.

+0

Điểm là cơ sở dữ liệu đã tồn tại với cấu trúc đã cho (và vì lý do kế thừa nó không thực sự thích ứng). Bảng không có gì hơn ba lĩnh vực tôi đã viết về (id, a_id, b_id). Nó sẽ là tốt đẹp để chèn các mục mới trong C mà không tạo ra một thực thể C (vô dụng) trong mã của tôi. Nhưng nhờ dù sao cho câu trả lời. Tôi đoán tôi chỉ cần tạo ra thực thể này sau đó ... – BHulliger

+0

@BHulliger xem cập nhật của tôi – Bozho

1

Nhưng thay vì khóa chính được tạo trên bảng C, tôi muốn có ID được tạo và ràng buộc duy nhất trên các trường a_id và b_id.

Thông thường, khóa chính của JoinTable được tạo thành từ sự kết hợp cả hai khóa ngoại. Ít nhất, đây là những gì JPA sẽ tạo ra. Nhưng nếu bạn không sử dụng nhà cung cấp JPA để tạo mô hình và nếu PK có thể được tạo ra bởi cơ sở dữ liệu (sử dụng cột IDENTITY, trình kích hoạt, vv), thì bạn có thể sử dụng bảng C cho liên kết ManyToMany của bạn (mà không cần phải giới thiệu một thực thể bổ sung và để biến đổi mối quan hệ trong hai OneToMany). Bạn đã thực sự thử?

5

Bạn nên làm iyt như thế này. Nhưng nó chỉ có thể được sử dụng cho danh sách (không cho các bộ)

@Entity 
@TableGenerator(name="ids_generator", table="IDS") 
public class Passport { 
    ... 

    @ManyToMany(cascade = CascadeType.ALL) 
    @JoinTable(name="PASSPORT_VISASTAMP") 
    @CollectionId(
     columns = @Column(name="COLLECTION_ID"), 
     [email protected](type="long"), 
     generator = "ids_generator" 
    ) 
    private Collection<Stamp> visaStamp = new ArrayList(); 
    ... 
} 
Các vấn đề liên quan