2015-01-14 16 views
5

Tôi đã dành vài giờ tìm kiếm xung quanh và không tìm thấy bất kỳ điều gì tương tự như trường hợp của tôi.JPA @JoinTable với điều kiện tham gia thêm

Giả sử sau nhiều-nhiều mô hình dữ liệu:

 
Contract (any business entity) 
- contract_id 
- other fields 

Party (another business entity) 
- party_id 
- other fields 

Contract_Party (relations between first two 
with additional role indicator, e.g. owner, signer, seller, etc) 
- contract_id 
- party_id 
- role 

Bây giờ chúng ta hãy giả sử tôi muốn để lập bản đồ tất cả hợp đồng liên quan đến dự tiệc (uni-directional). Bạn có thể thực hiện việc này bằng cách sử dụng chú thích sau trong Party lớp thực thể:

@OneToMany 
@JoinTable(
    name="Contract_Party", 
    joinColumns = {@JoinColumn(name="party_id", referencedColumnName="party_id")}, 
    inverseJoinColumns = {@JoinColumn(name="contract_id", referencedColumnName="contract_id")} 
} 
private List<Contract> contracts; 

Điều đó là tốt.

Nhưng điều tôi đang tìm kiếm là cách ánh xạ hợp đồng với vai trò cụ thể?

@OneToMany 
@??? ("ROLE = 'SIGNER' ") 
private List<Contract> signedContracts; 

Về mặt kỹ thuật tôi đang tìm kiếm một cách để bổ sung thêm điều kiện vào THAM GIA tuyên bố.

Cho đến nay tìm thấy những ý tưởng trong các chủ đề tương tự sau đây:

  • đồ tham gia bảng như một thực thể riêng biệt, và thực hiện lọc bởi vai trò sử dụng các truy vấn tùy chỉnh;
  • Hibernate có chú thích @JoinFormula, nhưng không có cách nào để áp dụng chú thích trong @JoinTable;
  • Hibernate cũng có chú thích @Where, nhưng nó thêm điều kiện cho bảng Hợp đồng không cho bảng kết nối;
  • sử dụng @MapKeyColumn và trả về Bản đồ thay vì Danh sách, nhưng tôi có thể có nhiều hợp đồng cho một vai trò;
  • tạo chế độ xem trên mặt DB (cái này hoạt động thực sự :)

Cảm ơn!

Trả lời

11

Bạn có thể sử dụng chú thích @WhereJoinTable. Nó áp dụng cho bảng hiệp hội

@OneToMany 
@JoinTable(
    name="Contract_Party", 
    joinColumns = {@JoinColumn(name="party_id",referencedColumnName="party_id")}, 
    inverseJoinColumns = {@JoinColumn(name="contract_id", referencedColumnName="contract_id")} 
} 
@WhereJoinTable ("ROLE = 'SIGNER' ") 
private List<Contract> contracts; 
+0

Cảm ơn rất nhiều, hoạt động như một nét duyên dáng! – Vitaljok

+0

Cảm ơn các ý tưởng. Tôi cũng có câu hỏi này, nhưng từ quan điểm của điều này: Làm cách nào để gọi tất cả các Bên, để có danh sách các hợp đồng tương ứng với vai trò = 'người ký'? Tôi có thể sử dụng truy vấn để thực hiện việc này không? Truy vấn JPA là gì? –

+0

liên quan: '@ JoinFormula' – Blauhirn

1

Bạn phải sử dụng:

@WhereJoinTable(clause = "ROLE ='SIGNER'") 
Các vấn đề liên quan