2009-03-13 61 views
27

Tôi hiện đang sử dụng Eclipselink, nhưng tôi biết hiện nay hầu hết các triển khai JPA đã được chuẩn hóa khá. Có cách nào để ánh xạ một thực thể JPA tới một khung nhìn không? Tôi không tìm cách chèn/cập nhật, nhưng câu hỏi thực sự là cách xử lý chú thích @Id. Mọi thực thể trong thế giới JPA phải có một trường ID, nhưng nhiều chế độ xem mà tôi đã tạo không tuân theo điều này. Có hỗ trợ bản địa cho điều này trong JPA hay tôi cần phải sử dụng hacks để có được nó để làm việc? Tôi đã tìm kiếm rất nhiều và tìm thấy rất ít thông tin về việc này.JPA có hỗ trợ ánh xạ tới chế độ xem sql không?

+0

Lần chức năng như bảng bình thường, tuy nhiên nếu bạn quan điểm không phù hợp tốt với bản đồ JPA ORM thay vào đó bạn có thể sử dụng một thủ tục lưu trữ để trả về một con trỏ tùy chỉnh hình thành từ các view (s). Bạn có thể ánh xạ các thủ tục đã lưu trong EclipseLink bằng cách sử dụng chú thích @NamedStoredProcedureQuery. Để biết thêm thông tin về Google này cho "Tiện ích mở rộng EclipseLink". –

Trả lời

7

Trong khi sử dụng @Id chú thích với các lĩnh vực của các loại hỗ trợ trực tiếp không phải là cách duy nhất để xác định danh tính của một thực thể (xem @IdClass với nhiều @Id chú thích hoặc @EmbeddedId với @Embedded), các đặc điểm kỹ thuật JPA đòi hỏi một khóa chính cho từng đối tượng.

Điều đó nói rằng, bạn không cần thực thể để sử dụng JPA với chế độ xem cơ sở dữ liệu. Khi ánh xạ tới một khung nhìn không khác với ánh xạ tới một bảng từ phối cảnh SQL, bạn vẫn có thể sử dụng các truy vấn gốc (createNativeQuery trên EntityManager) để lấy các giá trị vô hướng thay thế.

0

Tôi đã tự tìm hiểu điều này và tôi đã tìm thấy một bản hack rằng tôi không phải là 100% tác phẩm nhất định nhưng có vẻ đầy hứa hẹn.

Trong trường hợp của tôi, tôi có một cột FK trong giao diện có thể hoạt động hiệu quả như một PK - bất kỳ trường hợp cụ thể nào của đối tượng nước ngoài đó chỉ có thể xảy ra một lần trong chế độ xem. Tôi đã định nghĩa hai đối tượng ra khỏi trường đó: một được chỉ định ID và biểu thị giá trị thô của trường và trường còn lại được chỉ định chỉ đọc và đại diện cho đối tượng được nhắc tới.


@Id 
@Column(name = "foreignid", unique = true, nullable = false) 
public Long getForeignId() { 
... 

@OneToOne 
@JoinColumn(name = "foreignid", insertable=false, updatable=false) 
public ForeignObject getForeignObject() { 
... 

Như tôi đã nói, tôi không chắc chắn 100% cái này (và tôi sẽ xóa câu trả lời này nếu nó không hoạt động), nhưng mã của tôi đã vượt qua điểm sụp đổ cụ thể.

Dunno nếu áp dụng cho trường hợp cụ thể của bạn. Và có một cơ hội tuyệt vời sau 11 tháng, bạn không còn quan tâm nữa. :-) Cái quái gì, huy hiệu "Necromancer" không chỉ tự kiếm được ...

0

Theo quan điểm của tôi, tôi có một id "duy nhất", vì vậy tôi đã ánh xạ nó làm id Thực thể. Nó hoạt động rất tốt:

@Entity 
@Table(name="table") 
@NamedQuery(name="Table.findAll", query="SELECT n FROM Table n") 
public class Table implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(name="column_a") 
    private int columnA; 
Các vấn đề liên quan