2009-09-14 23 views
6

Có thể cấu hình Hibernate để lưu trữ một lớp thành phần trong một bảng riêng biệt không?Lập bản đồ thành phần hibernate vào một bảng riêng biệt

Lấy ví dụ sau đây:

<class name="test.ClassA"> 
    <property name="propA"/> 
    <component name="componentProp" class="test.ClassB"> 
     <property name="propB"/> 
    </component> 
</class> 

này bản đồ vào một bảng gọi là MyClass với hai cột propApropB. Những gì tôi muốn là ánh xạ các thuộc tính của thành phần với một bảng gọi là ClassB.

Những gì tôi không muốn làm là cấu hình ClassB như một thực thể tự nó (nó không có ý nghĩa bản sắc bên ngoài của ClassA), để bác bỏ một hiệp hội bình thường. Ngoài ra, tôi không thể sửa đổi mô hình đối tượng (mã được tạo ra), vì vậy tôi không thể giới thiệu một thuộc tính ID là ClassB.

Điều này có vẻ là một khoảng trống trong chức năng của Hibernate - thành phần <> ánh xạ thực hiện "nhiều lớp thành một bảng" và tham gia <> không "một lớp đến nhiều bảng", nhưng kỳ quặc không có cách nào rõ ràng để thực hiện "nhiều lớp học đến nhiều bảng", mà không cần đến các hiệp hội thực thể.

Lý do cơ bản của tôi cho điều này là tôi muốn lược đồ DB giống với mô hình đối tượng chặt chẽ như thực tế và bao gồm các bảng riêng biệt cho thành phần ClassB. Tôi hiểu rằng điều này sẽ không quy mô - bạn không thể làm các thành phần lồng nhau, ví dụ, nhưng đây không phải là một vấn đề trong tình huống cụ thể này.

Trả lời

6

Bạn có thể sử dụng <join><component> cùng nhau hoặc tôi hiểu nhầm câu hỏi của bạn?

<class name="test.ClassA"> 
    <property name="propA"/> 

    <join table="ClassB"> 
    <key column="ClassA_id" /> 
    <component name="componentProp" class="test.ClassB"> 
     <property name="propB"/> 
    </component> 
    </join> 

</class> 

Trong khi bạn (rõ ràng) cần một khóa ngoại, nó không cần phải được ánh xạ trong mô hình đối tượng. Chi tiết về tham gia được here - cung cấp cho đầy đủ mà thôi, tôi biết bạn biết được nơi để có được chúng từ :-)

Documentation tại liên kết ở trên không nói rõ ràng bất cứ điều gì về thành phần bản đồ trong phạm vi tham gia, nhưng DTD không cho phép nó và tôi đã có nó làm việc trong 3.1, vì vậy tôi khá chắc chắn nó vẫn hoạt động tốt. Tuy nhiên, không biết cách (hoặc liệu có thể) để ánh xạ điều này với chú thích.

+0

Ah, trông giống như những gì tôi cần, cảm ơn vì điều đó. Tôi sẽ đưa cô ấy ra cho một spin và xem nếu đó là vé. – skaffman

+0

Tôi tìm thấy kỹ thuật này được ghi trong phần 8.1.3 của "Java Persistence with Hibernate". Có vẻ như âm thanh. Cảm ơn một lần nữa. – skaffman

+0

Cảm ơn. Tôi bằng cách nào đó quản lý để không bao giờ đọc cuốn sách đó :-) – ChssPly76

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