2010-03-04 23 views
7

Tôi có một thực thể Person được ánh xạ bởi Hibernate vào bảng cơ sở dữ liệu trong danh mục cơ sở dữ liệu "Đang hoạt động". Sau một khoảng thời gian, các bản ghi trong bảng cơ sở dữ liệu này trong danh mục "Hoạt động" được lưu trữ/di chuyển đến một bản sao chính xác của bảng trong một Danh mục cơ sở dữ liệu "Lịch sử". Tôi có nhu cầu truy xuất từ ​​cả Catalog hoạt động và Lịch sử. Có cách nào tốt hơn để mô hình hóa điều này với chú thích Hibernate hơn là tạo một lớp trừu tượng mà 2 lớp mở rộng ra.Chú thích Hibernate cho Thực thể tồn tại trong hơn 1 danh mục

Đây là những gì tôi có bây giờ.

@MappedSuperclass 
public abstract class Person { 

    @Id 
    private Integer id; 
    private String name; 
} 

@Entity 
@Table(name="Person", catalog="Active") 
public class PersonActive extends Person { 
} 

@Entity 
@Table(name="Person", catalog="History") 
public class PersonHistory extends Person { 
} 

Trả lời

1

Theo hiểu biết của tôi, đó là cách phù hợp để thực hiện bằng chú thích (bạn có hai bảng để bạn cần hai thực thể). Sau đó chạy truy vấn đa hình trên thực thể Person. Tôi thấy điều này khá sạch sẽ bằng cách này.

PS: Bạn có thể thêm con trỏ vào cách thực hiện điều này với các tệp ánh xạ không, tôi thực sự tò mò.

+1

Cảm ơn thông tin chi tiết. Trong quá khứ khi tôi đã có yêu cầu kinh doanh này với các dự án khác mà tôi đã sử dụng Spring JDBC, tôi sẽ chỉ có một lớp và một bản đồ hàng cho cả hai bảng. Tôi chưa từng làm điều đó trước đây với chế độ ngủ đông, nhưng đây là ví dụ http://old.nabble.com/Mapping-class-to-multiple-tables-with-entity-name-(hibernate-plugin)- to9547563.html (...) (...)

0

Tôi nghĩ rằng có một tiểu dự án của các mảnh được đặt tên theo kiểu ngủ đông. Nó được thiết kế để làm việc với nhiều cơ sở dữ liệu quan hệ. Nếu bạn muốn sử dụng nó, bạn có thể cần những thay đổi lớn trong mã của bạn.

0

Suy nghĩ của tôi là viết truy vấn để chọn cả hai bảng từ db A và B. sau đó tạo truy vấn với chế độ ngủ đông và ánh xạ nó tới lớp của bạn.

dụ:

@Entity 
@NamedNativeQuery(
name="GetAllPerson", 
query="select * from A.Person inner join B.Person on A.Person.Id = B.Person.Id" 
) 
public class Person { 
... 
} 

Không chắc nếu nó có thể làm việc, câu hỏi của bạn làm tôi cũng tò mò về cách tốt nhất để làm điều đó :). Tôi sẽ kiểm tra nó tối nay sau giờ làm việc và xem nó có tốt không.

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