Java hibernate泛型继承

Java hibernate泛型继承,java,hibernate,inheritance,Java,Hibernate,Inheritance,我有一个泛型类,它是一些非泛型类的超类,它们只是设置它的泛型参数,如下所示: @ManagedProperty class A<T>{ @Id getId(){..} setID(int id){..} int id T t; T getT(){...} setT(T t){...} } @ManagedProperty 甲级{ @身份证 getId(){..} setID(int-id){..} 整数id T; T get

我有一个泛型类,它是一些非泛型类的超类,它们只是设置它的泛型参数,如下所示:

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

    T t;
    T getT(){...}
    setT(T t){...}
}
@ManagedProperty
甲级{
@身份证
getId(){..}
setID(int-id){..}
整数id
T;
T getT(){…}
setT(T){…}
}

@实体
类B扩展了{}
但我得到了MappingException,它说:

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


我应该如何修复它?

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

您可以做什么:

  • 将getT()定义为public或至少定义为protected。(我不确定这是否能解决您的问题。)
  • 使用@Type注释来定义Hibernate的具体类型(考虑到这一点,您可能会失去使用泛型类所获得的优势)
  • 使用xml配置文件而不是类B的注释。在这里,您将定义类B的配置,并且您甚至可以设置仅在超类中定义为私有或包私有的成员和getter的类型
  • 除了1。您也在B中定义了方法getT(),然后在那里调用super.getT()

  • 我总是做解决方案3——反正我不喜欢注释;-)

    尝试通过此线程阅读:)
    @Entity
    class B extends A<Integer>{}