2012-03-26 40 views
9

Tôi đang cố gắng tìm ra nếu JPA có thể tồn tại một bộ sưu tập trừu tượng với các triển khai cụ thể.Làm thế nào để ánh xạ một bộ sưu tập trừu tượng với jpa?

Cho đến nay mã của tôi trông như thế này:

@Entity 
public class Report extends Model { 

    @OneToMany(mappedBy = "report",fetch=FetchType.EAGER) 
    public Set<Item> items; 
} 

@MappedSuperclass 
public abstract class OpsItem extends Model { 

    @ManyToOne 
    public RetailOpsBranch report; 
} 


@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public class AItem extends OpsItem { 
... 
} 

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public class BItem extends OpsItem { 
... 
} 

Nhưng tôi giữ ngại về lỗi lập bản đồ dưới đây và tôi thực sự không biết nếu điều này là khả thi?

JPA error 
A JPA error occurred (Unable to build EntityManagerFactory): Use of @OneToMany or 
@ManyToMany targeting an unmapped class: models.Report.items[models.OpsItem] 

CẬP NHẬT

Tôi không nghĩ rằng vấn đề là với lớp trừu tượng nhưng các @MappedSuperClass chú thích. Có vẻ như jpa không thích ánh xạ mối quan hệ một đến nhiều với một số @MappedSuperClass. Nếu tôi thay đổi lớp trừu tượng thành một lớp cụ thể, tôi có cùng lỗi.

Nếu sau đó tôi thay đổi thành @Entity chú thích này dường như hoạt động với cả lớp trừu tượng và bê tông.

Điều này có vẻ hơi lạ khi ánh xạ một lớp trừu tượng với @Entity. Tôi có thiếu gì không?

SOLUTION

Managed để con nó ra với sự giúp đỡ từ rhinds. Hai điểm cần lưu ý:

1) lớp trừu tượng cần phải được chú thích với @Chính xác và chiến lược kế thừa của bảng trên mỗi lớp để các lớp con có bảng riêng.

2) Tạo ID danh tính sẽ không hoạt động trong trường hợp này và tôi phải sử dụng loại tạo bảng.

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public abstract class OpsItem extends GenericModel { 

    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE) 
    public Long id; 

    public String   branchCode; 

    @ManyToOne 
    public Report report; 
} 

@Entity 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
public class AItem extends OpsItem { 
... 
} 

Trả lời

6

Có thể, có thể. Bạn chỉ nên có MappedSuperClass trên lớp trừu tượng hàng đầu (không phải là sẽ tiếp tục tồn tại trong chính nó) và thêm chú thích thực thể vào các lớp thực hiện.

Hãy thử thay đổi nó một cái gì đó như thế này:

@MappedSuperclass 
public abstract class OpsItem extends Model { 

    @ManyToOne 
    public RetailOpsBranch report; 
} 

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public class AItem extends OpsItem { 
... 
} 

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public class BItem extends OpsItem { 
... 
} 

Kiểm tra phần này của tài liệu Hibernate để biết chi tiết về việc sử dụng nó: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#d0e1168


CẬP NHẬT

Xin lỗi, hoàn toàn bỏ qua bảng mỗi bit lớp. Hibernate không hỗ trợ ánh xạ các đối tượng trừu tượng cho bảng trên mỗi lớp (chỉ có thể ánh xạ Danh sách nếu tất cả các triển khai nằm trong một bảng SQL đơn lẻ và TABLE_PER_CLASS sử dụng chiến lược "bảng cho mỗi lớp cụ thể"

Chi tiết về các hạn chế và chiến lược tại đây: http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/#inheritance-limitations

+0

Tôi đã thử nhưng vẫn gặp lỗi. Có vẻ như bị nhầm lẫn khi nói đến ánh xạ tập hợp các mục.Tôi cũng đã cố gắng xác định thực thể được ánh xạ nhưng vẫn nhận được thông báo lỗi tương tự. – emt14

+0

xem câu trả lời cập nhật của tôi – rhinds

+0

Humm, vì vậy về cơ bản có mối quan hệ một đến nhiều trên một lớp trừu tượng và một số triển khai cụ thể với bảng riêng của họ là không thể? – emt14

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