2011-08-29 26 views
6

Tôi đang cố gắng ánh xạ các bảng từ một cơ sở dữ liệu (trong số 60 bảng) bằng cách sử dụng JPA. Tôi đang làm điều này cho một ứng dụng đa ngôn ngữ, do đó mọi phần dữ liệu phải có sẵn bằng nhiều ngôn ngữ.Lập bản đồ các bảng i18n trong JPA

Cấu trúc bảng cơ sở dữ liệu của tôi giống như thế này. Tôi có một bảng Region, có liên quan đến một bảng RegionLanguage. Bảng RegionLanguage thực sự chứa mô tả cho Vùng đó bằng các ngôn ngữ khác nhau. Bạn có thể muốn có một cái nhìn tại sơ đồ này:

enter image description here

Khi nói đến JPA, tôi thấy khó để lập bản đồ nó trong một cách mà sẽ yêu cầu các hiệp hội càng ít càng tốt. Tôi đã cố gắng sử dụng khái niệm bảng phụ, nhưng nó không thành công trong một số trường hợp vì đây là mối quan hệ @OneToMany. Tốt hơn là, tôi đã nghĩ đến một giải pháp mà sẽ làm cho hai bảng này xuất hiện như một đối tượng duy nhất.

Trợ giúp của bạn được đánh giá cao.

Xin cảm ơn trước.

+2

Bạn đã tìm thấy giải pháp cho vấn đề này chưa? Và nếu có, bạn có muốn chia sẻ nó (như một câu trả lời) không? Chúng tôi đang đối mặt với cùng một vấn đề, chưa tìm thấy một giải pháp tốt đẹp nào (hầu hết là kết quả trong các truy vấn N + 1, mà chúng tôi chắc chắn không muốn). – wimvds

+0

Nhà cung cấp JPA nào bạn đang sử dụng? – siebz0r

+0

Tôi hoàn toàn không hiểu tại sao một liên kết @OneToMany đơn giản giữa Region và RegionLanguage không hoạt động cho bạn? –

Trả lời

0

Tôi không chắc tôi hiểu sơ đồ lạ này ... RegionLanguage có một số loại khoá ngoại nào đó trỏ đến Region.id, tôi lấy nó? Nếu Region chỉ có một cột (như được hiển thị trên 'sơ đồ'), bạn có thể chỉ đơn giản là ánh xạ 'RegionLanguage' và bạn sẽ chỉ có một thực thể như bạn muốn --- không có thông tin nào bị mất;).

Nhưng nghiêm túc, bạn muốn nó được lập bản đồ như thế nào? Bạn có muốn có một cái gì đó như thế này:

class Region { 
//.. the missing fields not shown in diagram 
    List<String> languages; // take only language to avoid creating separate entity for region language 
} 

hoặc một cái gì đó như thế này:

class RegionInnerJoinRegionLanguage { 
// all fields from Region 
// all fields from RegionLanguage 
} 

Trong bất kỳ trường hợp bạn không nói như thế nào với phần còn lại của bảng được kết nối với các bảng i18n của bạn. Từ mô tả của bạn, tôi đoán, rằng tất cả các bảng có fk để RegionLanguage. Tôi không chắc bảng Region được sử dụng như thế nào trong kế hoạch lớn của mọi thứ. Tôi đoán nó chỉ là để nhóm các ngôn ngữ ... Tôi tưởng tượng này 'mô hình' Thụy Sĩ (một 'khu vực' 4 ngôn ngữ) ... Nhưng bạn sẽ làm gì với các ngôn ngữ được nói ở một số khu vực? Bạn sẽ có một số ngôn ngữ tiếng Pháp, tiếng Anh, vv (một cho mỗi khu vực) và tất cả dữ liệu nhân với mỗi người trong số đó?

Tôi biết bạn không yêu cầu điều này ... Tôi chỉ nghĩ rằng bạn đã đơn giản hóa cấu trúc dữ liệu của bạn cho câu hỏi này ... Rất nhiều để khó đoán những gì bạn thực sự muốn đạt được.

Trong mọi trường hợp, nếu bạn muốn sử dụng danh sách các cách tiếp cận chuỗi, bạn có thể thử này:

@ElementCollection 
    @CollectionTable(name="RegionLanguage", 
     [email protected](name="regionID") // or whatever... it's not on your diagram. 
) 
    @Column(name="langage") 
    private List<String> langages; 

tôi vẫn không hiểu tại sao bạn muốn đặt cả hai bảng thành một thực thể duy nhất .. Nếu đó là dữ liệu 'chỉ đọc', bạn có thể thử tạo chế độ xem và ánh xạ nó --- luôn luôn là 'cách thoát';). Nhưng nó (cả hai người trong số họ, trên thực tế) một chút quá phức tạp, với tâm trí của tôi --- nó sẽ cắn bạn trong tương lai. Lời khuyên của tôi là chỉ cần đi với 'bản đồ OneToMany đơn giản'.

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