【问题标题】:How to map Java generic instances with Hibernate如何使用 Hibernate 映射 Java 泛型实例
【发布时间】:2011-08-16 13:12:52
【问题描述】:

我正在尝试在 Hibernate 中映射通用类型。我已经搜索过,但找不到明确的答案。帮助将不胜感激。 以下是一些示例类:

public class Person {
  ...
}

public class PersonA extends Person {
  ...
}
public class PersonB extends Person {
  ...
}
public class PersonHolder<P extends Person> {
  private P person;
  ...
}
public class People {
  private Map<String, PersonHolder<PersonA> > aPeople;
  private Map<String, PersonHolder<PersonB> > bPeople;
  ...
}

我正在使用本机 Hibernate 映射(XML,无注释)。我已经有 Person、PersonA 和 PersonB 的 Hibernate 映射,但我想知道是否可以在不显式创建通用实现子类的情况下以通用方式映射 PersonH​​older 类的实例化,例如:

public class PersonAHolder extends PersonHolder<PersonA> {
  ...
}

(并将此类映射为普通类)。

谢谢!

【问题讨论】:

  • 我最近回答了这个相同(或非常相似)的问题。 [看看它][1]。 [1]:stackoverflow.com/questions/7000428/…
  • 注解让调试变得非常简单。您要实现的目标称为多态映射,请参阅stackoverflow.com/questions/979200/hibernate-polymorphism 了解更多信息。您可以使用接口来处理您的 People 类。
  • 我没有尝试调试注解,但是一旦你掌握了 XML,XML 调试就相当容易了。 XML 的缺点是解析器错误消息不会告诉您错误在哪个文件中。

标签: java hibernate generics


【解决方案1】:

不幸的是,AFAIK 是不可能的。在字节码中,PersonHolder&lt;PersonA&gt;PersonHolder&lt;PersonB&gt; 之间没有区别,因为类型擦除,因此 Hibernate 无法区分它们。

编辑:澄清一下,我说的是PersonHolder 的直接实例。如果您有定义具体泛型类型的子类,您可以获得泛型类型信息。但这需要有子类,这与问题相矛盾:

我想知道是否可以以通用方式映射 PersonH​​older 类的实例化而不显式创建通用实现子类,例如:

【讨论】:

  • 这实际上不是真的。字段、方法参数、方法返回类型和扩展具有特定类型的其他类的类确实在编译后维护该信息。
  • @jtahlborn 对于PersonAHolder,这是真的,您可以获得扩展PersonHolder&lt;PersonA&gt; 的信息——但OP 想要WITHOUT。因此,您无法区分不保留引用的 PersonHolder 实例。我没有谈论子类。
  • @jtahlborn 不支持在 Java 中对泛型进行具体化;确实捕获了一些类型信息,但这不是适当的具体化支持;托马斯的回答是有效的。
  • 可能的,正如我在回答中指出的那样,但我的回答似乎已移至评论。我刚刚在这里回答了这样一个问题:stackoverflow.com/questions/7000428/…
  • @Thomas - 如果您阅读我的评论,我提到的情况 other 不是子类化。在原始示例中,特定的泛型信息可用于字段aPeoplebPeople。 @01res - 是的,我非常了解具体化,我建议您阅读 java 对泛型的实际作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-18
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
相关资源
最近更新 更多