2

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

@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 说:

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

我应该如何解决?

4

1 回答 1

0

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

你可以做什么:

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

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

于 2012-10-25T07:18:39.243 回答