2010-09-30 46 views
32

Bạn định cấu hình chú thích trong mã ví dụ sau đây như thế nào? Tôi muốn gắn bó với chú thích JPA chỉ và tránh các phụ thuộc cụ thể của Hibernate. Mã dưới đây có đúng không?Lớp trừu tượng được thừa kế với JPA (+ Hibernate)

@Entity 
public class RefExample extends RefData { 

} 

(Sẽ có nhiều phiên bản của các lớp này, RefSomeOtherExample, vv, và bảng một db mỗi lớp. Một số có thể thêm các trường bổ sung (cột) nhưng hầu hết chỉ đơn giản là sẽ tận dụng các lĩnh vực cơ bản kế thừa từ "RefData" lớp cơ sở)

cơ sở lớp:.

@Entity 
public abstract class RefData { 

    private long id; 
    private String code; 
    private String desc; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(unique = true, nullable = false) 
    public long getId() { 

     return id; 
    } 

    public void setId(long id) { 

     this.id = id; 
    } 

    @Column(unique = true, nullable = false, length=8) 
    public String getCode() { 

     return code; 
    } 

    public void setCode(String code) { 

     this.code = code; 
    } 

    @Column(unique = true, nullable = false, length=80) 
    public String getDesc() { 

     return desc; 
    } 

    public void setDesc(String desc) { 

     this.desc = desc; 
    } 
} 

Cuối cùng, tôi muốn tạo ra các script tạo giản đồ từ này sử dụng lớp SchemaExport Hibernate của. Trong trường hợp trên, hai lớp này sẽ chỉ dẫn đến việc tạo ra một bảng duy nhất có tên "RefExample" với ba cột từ "RefData". Điều này có hiệu quả không?

Trả lời

75

Từ JPA 1.0 đặc điểm kỹ thuật:

Cả lớp trừu tượng và bê tông có thể thực thể. Cả hai lớp trừu tượng và cụ thể đều có thể được chú thích bằng chú thích Entity, được ánh xạ dưới dạng thực thể và được truy vấn dưới dạng thực thể.

Thực thể có thể mở rộng các lớp không phải thực thể và các lớp không phải thực thể có thể mở rộng các lớp thực thể.

Như bạn muốn có một bảng, bạn nên sử dụng thừa kế Single Table.

Chỉ cần xác định một cột phân biệt như sau:

@Entity 
@DiscriminatorColumn(name="REF_TYPE") 
public abstract class RefData { 

Nhưng nếu bạn không muốn phải dựa vào chiến lược thừa kế JPA, bạn có thể sử dụng MappedSuperclass thay vì:

@MappedSuperclass 
public abstract class RefData { 

đặc điểm kỹ thuật JPA

Một thực thể có thể kế thừa từ một lớp cha cung cấp thông tin bản đồ trạng thái và ánh xạ thực thể liên tục, nhưng w hich không phải là một thực thể. Thông thường, mục đích của một lớp phủ được ánh xạ như vậy là để xác định thông tin trạng thái và ánh xạ phổ biến cho nhiều lớp thực thể.

Lưu ý bạn không thể sử dụng @Entity và @MappedSuperclass cùng một lúc.

+0

@Crusader Xem tại đây: http://stackoverflow.com/questions/2700680/table-per-subclass-inheritance-relationship-how-to-query-against-the-parent-clas/3017146#3017146 cách tôi giải quyết các vấn đề về hiệu suất khi giao dịch với thừa kế. ** Nếu bạn muốn sử dụng chiến lược TABLE PER CLASS, cơ sở dữ liệu đích phải hỗ trợ chiến lược tạo danh tính **. –

+1

Không chắc chắn 100% nhưng tôi nghĩ rằng MappedSuperclass có thể là lựa chọn tốt nhất của tôi. Tất cả các bảng này thực sự là để lưu trữ các giá trị được trình bày trong các trường thả xuống được gán (một đến nhiều) cho các bản ghi dữ liệu thực tế. – Manius

+0

Có thể truy vấn (HQL hoặc JPQL) trên các thuộc tính có trong siêu lớp được chú thích với @MappedSuperclass không – Sunil

0

Bạn có thể sử dụng một trong các chiến lược kế thừa để thực hiện việc này. Trường hợp của bạn có vẻ như là trường hợp của lớp đơn cho cấu trúc phân cấp.

Kiểm tra this

+1

Bài viết đó khiến tôi bối rối. Tôi đã thực sự hình dung bảng cho mỗi chiến lược lớp bê tông mô tả ở đó (một bảng cho mỗi lớp "RefExample" cụ thể), nhưng nó nói rằng cách tiếp cận là "không phổ biến" và tùy chọn trong JPA. Không có trong ba tùy chọn dường như chính xác phù hợp với yêu cầu của tôi. Chuột! – Manius

5

@MappedSuperClass đã hoạt động đối với tôi. Tôi đã đấu tranh để lập bản đồ một khung nhìn cho 2 đối tượng là các lớp cha và con. Chế độ xem của tôi được kết hợp từ 2 bảng. Các khóa chính từ cả hai bảng đều có trong khung nhìn.@DiscriminatorColumn không hoạt động đối với tôi vì nó yêu cầu cột được phân bổ độc quyền cho loại dữ liệu của đối tượng và cũng có thể ném 'repeated Column in object exception' mà tôi không thể giải quyết được.

Tôi đã đọc diễn đàn này và tôi đã thử chú thích @MappedSuperClass. Nó làm các trick.

Tôi đã đặt @MappedSuperClass tại lớp cha và đặt @ id@GeneratedValue trong nhận dạng lớp cha. Trong thư mục con tôi đã đưa ra là

@Entity 
@Table(name="view_name") 

và sử dụng đối tượng lớp con để tìm nạp dữ liệu từ chế độ xem. Đó là nó.

Thừa kế trong chú thích ngủ đông cho bảng Đã tham gia bằng cách sử dụng @DiscriminatorColumn làm việc cho tôi.

Cảm ơn bạn.

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