2016-06-30 28 views
6

Tôi muốn cho dù nó có thể xử lý một hiệp hội với một trừu tượng Entity (tức là: một giao diện ), trong một thực thể. ví dụ:
Tôi có một số class được gọi là Foo có thuộc tính bar, thuộc loại Bar, là interface. Nhiều lớp học (Bar1, Bar2) nhận ra Bar và là tất cả cũng có thể tồn tại.Xử lý một hiệp hội với một giao diện sử dụng ORM trong Java

class Foo{ 
    Bar bar; // this will be either Bar1 or Bar2 
} 

interface Bar{ 
    // some methods 
} 

class Bar1 implements Bar{ 
    String s; // Bar1 and Bar2 have different represantations ,hence they must be persisted to different tables 
} 

class Bar2 implements Bar{ 
    int i; 
} 

Bây giờ tôi có thể xử lý điều này bằng ORM bằng Java như thế nào? tức là: khi tôi truy xuất số Foo, đó là bar là phiên bản của một trong các thực hiện của Bar.

+0

Hibernate hỗ trợ ba chiến lược lập bản đồ thừa kế cơ bản: 1. bảng mỗi lớp phân cấp 2. bảng mỗi lớp con 3. bảng mỗi lớp bê tông – amitmah

+0

tham khảo: https://docs.jboss.org /hibernate/orm/3.5/reference/en-US/html/inheritance.html Tôi nghĩ bạn có thể xử lý các giao diện theo cùng cách với các lớp Tóm tắt trong Hibernate. – amitmah

Trả lời

4

Có, bạn có thể hỗ trợ các hiệp hội đa hình, nhưng bạn sẽ cần phải thực hiện một Barabstract cơ sở @Entity lớp thay vì một interface, như JPA không hoạt động tốt với các giao diện, ví dụ:

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
public abstract class Bar { 
    ... 
} 

@Entity 
public class Bar1 extends Bar { 
    private String s; 
    ... 
} 

@Entity 
public class Bar2 extends Bar { 
    private int i; 
    ... 
} 

Nếu bạn mô hình hóa nó theo cách này, bạn sẽ có thể truy vấn các trường hợp Bar đa hình bằng cách sử dụng JP-QL, ví dụ select b from Bar.

tham khảo:

https://docs.oracle.com/javaee/7/tutorial/persistence-intro002.htm#BNBQN

+0

Câu hỏi Cụ thể yêu cầu liên kết với giao diện **. Tức là, để cung cấp các "khung nhìn" khác nhau cho một lớp duy nhất, mà không thể được thực hiện bằng cách sử dụng một lớp trừu tượng. – user2268997

+0

Câu trả lời là chính xác. Có lẽ nó phụ thuộc vào nhà cung cấp ORM. Miễn là tôi biết cho Hibernate nó là chính xác. Nó không chơi tốt với giao diện. Để làm việc với giao diện, bạn cần xác định lớp thực hiện. Một khi bạn làm các đa hình bị phá hủy. –

1

Liên quan đến câu trả lời CK1, nhưng với một bảng duy nhất.

Sử dụng InheritanceType.JOINED yêu cầu bảng cho lớp cơ sở và một bảng cho mỗi lớp con. Nếu bạn sử dụng InheritanceType.SINGLE_TABLE với DiscriminatorColumn, bạn có thể lưu trữ tất cả các thực thể của mình trong một bảng và vẫn truy xuất trong một bộ sưu tập. Bạn cũng có thể kết hợp các DiscriminatorColumn với InheritanceType.JOINED nếu bạn muốn có thể cho biết loại đối tượng nằm trong lớp cơ sở, trong khi vẫn giữ các trường cụ thể của lớp con trong các bảng riêng biệt.

@Entity 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "DISC") 
public abstract class Bar { 
    ... 
} 

@Entity 
@DiscriminatorValue("BAR1") 
public class Bar1 extends Bar { 
    ... 
} 

@Entity 
@DiscriminatorValue("BAR2") 
public class Bar2 extends Bar { 
    ... 
} 
Các vấn đề liên quan