2011-08-09 44 views
14

Tôi đang gặp một số khó khăn khi hiểu cách Hibernate giao dịch với Generics và đã tự hỏi cách tốt nhất để hoàn thành mục tiêu của tôi.Sử dụng ngủ đông với generics

Cho một thực thể chung đơn giản:

@Entity 
public class Box<T>{ 

    private T t;  
    @Id 
    private long id; 

    public void setT(T t) { 
     this.t = t; 
    } 

    public T getT() { 
     return t; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    public long getId() { 
     return id; 
    } 
} 

Khi đi qua ngủ đông khởi, tôi nhận được ngoại lệ: ...has an unbound type and no explicit target entity. Resolve this Generic usage issue or set an explicit target attribute (eg @OneToMany(target=) or use an explicit @Type

Tôi gần như chắc chắn đây là bởi vì tôi đã không cho ngủ đông một danh sách các những hạn chế của những gì <T> thực sự có thể là. Tôi biết bạn có thể chỉ định những thứ như targetEntity=String.class ở trên t trong chú thích, nhưng sau đó bạn mất tính linh hoạt của việc có generics. Tôi có thể giới hạn phạm vi của một chú thích sử dụng chung có thể chấp nhận được không? Ví dụ: Nếu tôi muốn các lớp học ChildA, ChildB, người được kế thừa từ lớp trừu tượng Parent để có thể tồn tại ở đó. Ngoài ra, nó cũng sẽ có thể chấp nhận String s. Có thể Hibernate giải quyết một vấn đề như vậy không?

+2

Làm thế nào để bạn mong đợi Hibernate để xây dựng một đối tượng chung chung như vậy? Nó có vẻ như bạn sẽ phải có một số loại phân biệt đối xử cột và xác định tất cả các đối tượng có thể có thể được sử dụng. Nhưng, tôi không biết liệu điều đó có thể xảy ra ở đây không. – Jeremy

+1

Đó chính xác là những gì tôi đang hỏi! :) – Ryan

Trả lời

13

gì bạn đang tìm kiếm có lẽ là Hibernate của implicit polymorphism. Ngoài ra còn có một little-known "any" relationship mang lại sự linh hoạt hoàn toàn, nhưng nó có sự cân bằng của nó. Bạn cũng có thể sử dụng "bất kỳ" nào trong một số many-to-any.

Chỉnh sửa: Tôi đã tạo một ví dụ có thể chạy trên Github dựa trên lớp "Hộp" của bạn và sử dụng ánh xạ @Any. Bạn có thể browse it (hoặc Box class cụ thể) hoặc kiểm tra xem nó ra và chạy nó với

git clone git://github.com/zzantozz/testbed tmp 
cd tmp 
mvn -q compile exec:java -Dexec.mainClass=rds.hibernate.AnyMapping -pl hibernate-any 
+0

Ryan, có bất kỳ nơi nào trực tuyến có tham chiếu đến việc sử dụng kiểu ánh xạ này bằng cách sử dụng Generics không? Tôi tin rằng có một mô tả về những gì bạn đang đề cập đến ở đây: http://v4forums.wordpress.com/2008/12/27/implicit-explicit-polymorphism-in-hibernate/ tuy nhiên ví dụ đó dường như không thỏa mãn những gì Tôi muốn làm. Bạn đang nói tôi có thể chú thích các trường chung của tôi với @any (xxx) với các lớp có thể được sử dụng? – Ryan

+0

Tôi nên đã hướng dẫn bạn đến [tài liệu 3.6 mới hơn] (http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/mapping.html#mapping-types-anymapping). Họ có nhiều chi tiết hơn. Tôi cập nhật câu trả lời của tôi với liên kết đó và với một ví dụ chạy được. –

+0

Cảm ơn bạn rất nhiều vì đã trải qua điều này. Giải thích và trả lời tuyệt vời. – Ryan

4

Tôi đã làm điều đó nhưng với các lớp con.

lớp generic của bạn phải trừu tượng và lớp con phải xác định các tham số chung

+0

Tôi hiểu rằng một phần, nhưng những gì về một loại đối tượng như 'String' mà không có gì để làm với cây thừa kế đó. Có thể chỉ định bổ sung không? – Ryan

+0

những gì tôi muốn nói là bạn có thể chỉ định chung chung chỉ khi lớp có định nghĩa chung chung không được lưu trong cơ sở dữ liệu như hibernate không biết phải lưu cái gì. Bạn có thể sử dụng trường targetEntity để chuyên rằng –

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