我有一个泛型类,它是一些非泛型类的超类,而这些类只是像这样设置其泛型参数:
@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-无论如何我都不喜欢注释;-)