我有一个泛型类,它是一些非泛型类的超类,而这些类只是像这样设置其泛型参数:

@ManagedProperty
class A<T>{
    @Id
    getId(){..}
    setID(int id){..}
    int id

    T t;
    T getT(){...}
    setT(T t){...}
}




@Entity
class B extends A<Integer>{}


但我得到MappingException,其中说:


  它具有未绑定的类型,没有明确的目标实体。解决此通用用法问题或设置一个明确的目标属性。


我该如何解决?

最佳答案

您的示例不起作用。 getT()被定义为私有包,这意味着它在子类B中不可见。当Hibernate用反射对类进行解析时,可以找到方法getT(),但是由于此方法在子类中不可见,因此反射可以没有提供类型。

你可以做什么:


将getT()定义为public或至少定义为protected。 (我不确定这是否可以解决您的问题。)
使用@Type批注定义Hibernate的具体类型(这样您可能会失去通过通用类获得的优势)
使用xml配置文件代替类B的注释。在那里,您将定义类B的配置,甚至可以设置成员和获取方法的类型,这些成员和获取方法的类型仅在超类中定义为私有或包私有。
除了1.之外,您还可以在B中定义方法getT(),在那里您只需调用super.getT()。


我总是做解决方案3-无论如何我都不喜欢注释;-)

10-02 06:49