2011-11-30 37 views
6

Tôi đang sử dụng chú thích Hibernate để duy trì các lớp học của mình. Hiện tại tôi đang sử dụng chiến lược sau đây để lập bản đồ các lớp họcHibernate Polymorphic HQL SELECT statement

Tôi có lớp trừu tượng là lớp Gốc và tôi có hai lớp con kế thừa từ số Mẹ, Cha.

tôi ánh xạ nó như thế:

@MappedSuperclass 
public abstract class Parent { 

private int age; 
private String name; 
... 
} 

Và hai lớp khác được khai báo như thế này:

@Entity 
public Class Father extends Parent { 

private boolean haveMustash; 
... 
} 

Vì vậy, về cơ bản là kịch bản là "Bảng mỗi lớp".

Bây giờ tôi muốn tạo một câu lệnh HQLnate HQL sẽ cập nhật tuổi của một phụ huynh, bất kể đó là loại (mẹ, cha). phụ huynh sẽ được tra cứu bằng cách sử dụng cột tên, đó là duy nhất trong cả hai bảng. nhưng tôi không biết chỉ nhìn vào tên nếu đó là Mẹ hoặc Cha. Làm thế nào tôi có thể tạo một câu lệnh HQL sẽ xem xét cả hai bảng và trả về đúng thực thể để cập nhật?

Tôi nghĩ về một cái gì đó như thế này: (nhưng tôi không có một ý tưởng nếu nó thậm chí có thể)

Parent parent = hibernateTemplate.find("from Mother,Father where name=" 
     + name); 

Trả lời

2
from Parent p where p.name = :name 

(không kiểm tra). Lưu ý rằng nếu nó hoạt động, nó sẽ dẫn đến hai truy vấn, vì cả hai thực thể đều không có điểm chung, ngoại trừ chúng không thừa hưởng một số thuộc tính được ánh xạ từ một siêu lớp. Bạn không có thừa kế thực thể ở đây và không triển khai bảng cho mỗi chiến lược lớp. Bạn sẽ nếu Phụ huynh được chú thích bằng @Entity thay vì @MappedSuperClass và nếu bạn đã xác định chiến lược thừa kế sử dụng @Inheritance.

+0

Nó không hoạt động, tôi nhận được phụ huynh không được ánh xạ (Hibernate ngoại lệ) – stdcall

+0

Vâng, sau đó bản đồ nó. –

+0

Ý tưởng chung là để nó không được lập bản đồ, đó là một lớp trừu tượng, Cha & Mẹ lấy bản đồ cơ bản của nó từ nó. – stdcall

-1

Theo tham chiếu Hibernate, tính năng này đang hoạt động!

Nhiều lớp học có thể xuất hiện, dẫn đến việc tham gia sản phẩm hoặc tham gia chéo ".

from Formula, Parameter

(Xem 14,2)

Hibernate Reference

Bạn cũng có thể tìm kiếm trong cả hai bảng riêng rẽ và sau đó kiểm tra cái nào là không null?

1

Câu trả lời của JB Nizet là chính xác. Sử dụng @Entity để ánh xạ Phụ huynh, thay vì @MappedSuperclass. Điều này cho phép bạn chạy các truy vấn và cập nhật Hibernate trên Parent, (sau này chỉ cho phép bạn chạy nó trên Cha và Mẹ). Bạn có thể giữ cho bảng của bạn trên mỗi lớp với chú thích @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS).

from Mother,Father sẽ không hoạt động kể từ khi tham gia hoàn toàn vào các bảng. Những gì bạn muốn là một công đoàn. Sử dụng @Entity, Hibernate sẽ tự động thực hiện việc này cho bạn.

+0

Giải thích tốt. Thông tin thừa kế cần phải được thêm vào lớp Parent để cho phép Hibernate hoàn thành công việc của mình. – germanio

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