2013-05-27 42 views
28

Kịch bản nào tốt nhất khi sử dụng chú thích DiscriminatorValue trong chế độ ngủ đông?Khi nào sử dụng chú thích DiscriminatorValue trong hibernate

+1

Có bạn cố gắng đi qua tài liệu, ca n tham khảo http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#d0e1168 & http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html /inheritance.html#inheritance-tablepersubclass-discriminator –

Trả lời

38

Những 2 liên kết giúp tôi hiểu khái niệm thừa kế nhất:

http://docs.oracle.com/javaee/6/tutorial/doc/bnbqn.html

http://www.javaworld.com/javaworld/jw-01-2008/jw-01-jpa1.html?page=6

Để hiểu phân biệt, trước tiên bạn phải hiểu được chiến lược thừa kế: SINGLE_TABLE, tham gia, TABLE_PER_CLASS.

Phân biệt đối xử thường được sử dụng trong kế thừa SINGLE_TABLE vì bạn cần cột để xác định loại bản ghi.

Ví dụ: Bạn có một lớp Học sinh và 2 lớp con: GoodStudent và BadStudent. Cả hai dữ liệu tốt và BadStudent sẽ được lưu trữ trong 1 bảng, nhưng tất nhiên chúng ta cần phải biết loại và đó là khi DiscriminatorColumn sẽ đến. Xem các liên kết tôi đã đăng ở trên.

4

Khi bạn có kế thừa thực thể sử dụng chiến lược bảng đơn và bạn muốn giá trị của cột phân biệt đối xử không phải là tên của lớp của lớp bê tông thực thể hoặc khi loại cột phân biệt đối xử không phải STRING.

Điều này được giải thích, ví dụ: the javadoc.

0

Dưới đây là lời giải thích và một ví dụ trên bàn ngủ đông mỗi hệ thống phân cấp lớp, xem xét, chúng tôi đã lớp cơ sở tên là Thanh toán và 2 lớp có nguồn gốc như CreditCard, Kiểm tra

Nếu chúng ta lưu các đối tượng lớp được thừa kế như CreditCard hoặc Kiểm tra sau đó tự động Đối tượng lớp thanh toán cũng sẽ được lưu vào cơ sở dữ liệu, và trong cơ sở dữ liệu tất cả các dữ liệu sẽ được lưu trữ vào một bảng duy nhất, đó là bảng lớp cơ sở cho chắc chắn. Nhưng ở đây chúng ta phải sử dụng thêm một cột phân biệt đối xử trong cơ sở dữ liệu, chỉ để xác định đối tượng lớp dẫn xuất đã được lưu trong bảng cùng với đối tượng lớp cơ sở, nếu chúng ta không sử dụng cột này ngủ đông sẽ ném ngoại lệ

0

Hãy để tôi giải thích cho bạn một ví dụ. Giả sử bạn có một lớp có tên là Animal và dưới lớp Animal, có nhiều lớp con như Reptile, Bird ... vv.

Và trong cơ sở dữ liệu bạn có bảng gọi ANIMAL

--------------------------- 
ID||NAME  ||TYPE  || 
--------------------------- 
1 ||Crocodile ||REPTILE || 
--------------------------- 
2 ||Dinosaur ||REPTILE || 
--------------------------- 
3 ||Lizard ||REPTILE || 
--------------------------- 
4 ||Owl  ||BIRD  || 
--------------------------- 
5 ||parrot ||BIRD  || 
--------------------------- 

đây cột TYPE được gọi DiscriminatorColumn, bởi vì cột này chứa dữ liệu tách biệt rõ ràng Loài bò sát và chim. Và dữ liệu REPTILEBIRD trong cột TYPE là DiscriminatorValue.

Vì vậy, trong phần java cấu trúc này sẽ như thế nào:

Animal lớp:

@Getter 
@Setter 
@Table(name = "ANIMAL") 
@Entity 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING, name = "TYPE") 
public class Animal { 

    @Id 
    @Column(name = "ID") 
    private String id; 

    @Column(name = "NAME") 
    private String name; 

} 

lớp Bò sát: lớp

@Entity 
@DiscriminatorValue("REPTILE") 
public class Reptile extends Animal { 

} 

Bird:

@Entity 
@DiscriminatorValue("BIRD") 
public class Bird extends Animal { 

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