【问题标题】:Using hibernate with generics使用带有泛型的休眠
【发布时间】:2011-10-23 10:43:11
【问题描述】:

我在理解 Hibernate 如何处理泛型时遇到了一些麻烦,并且想知道实现目标的最佳方式。

给定一个简单的通用实体:

@Entity
public class Box<T>{

  private T t;    
  @Id
  private long id;

  public void setT(T t) {
      this.t = t;
  }

  public T getT() {
      return t;
  }

  public void setId(long id) {
      this.id = id;
  }

  public long getId() {
      return id;
  }
}

在进行休眠初始化时,出现异常:...has an unbound type and no explicit target entity. Resolve this Generic usage issue or set an explicit target attribute (eg @OneToMany(target=) or use an explicit @Type

我几乎可以肯定这是因为我没有给 hibernate 一个限制列表,以限制 &lt;T&gt; 实际上可以是什么。我知道你可以在注解中指定诸如t 上方的targetEntity=String.class 之类的东西,但是这样你就失去了使用泛型的灵活性。我可以使用注释来限制可接受的泛型范围吗?例如:如果我希望从抽象类Parent 继承的类ChildAChildB 可以在那里持久化。此外,它还应该能够接受Strings。 Hibernate可以处理这样的事情吗?

【问题讨论】:

  • 您希望 Hibernate 如何构建这样一个通用对象?似乎您必须拥有某种鉴别器列并识别所有可能使用的对象。但是,我不知道这是否可能在这里。
  • 这正是我要问的! :)

标签: java hibernate generics inheritance orm


【解决方案1】:

您要查找的可能是 Hibernate 的 implicit polymorphism。还有一个little-known "any" relationship,它提供了完全的灵活性,但它有其权衡。您还可以在 many-to-any 中使用“any”。

编辑:我在 Github 上基于您的“Box”类并使用 @Any 映射创建了一个可运行的示例。您可以browse it(或特别是Box class)或查看并运行它

git clone git://github.com/zzantozz/testbed tmp
cd tmp
mvn -q compile exec:java -Dexec.mainClass=rds.hibernate.AnyMapping -pl hibernate-any

【讨论】:

  • Ryan,网上有没有提到使用泛型使用这种类型的映射?我相信在这里找到了您所指内容的描述:v4forums.wordpress.com/2008/12/27/… 但是该示例似乎不能满足我想要做的事情。你是说我可以用@any(xxx) 用可能使用的类来注释我的通用字段?
  • 我应该把你转到newer 3.6 docs。他们有更多的细节。我用那个链接和一个可运行的例子更新了我的答案。
  • 非常感谢您完成此操作。很好的解释和答案。
  • Ryan:如果 Box 还需要 的列表以及 T 的对象,这将如何改变?
  • 我从来不需要或偶然发现一种方法来做到这一点。我不确定这是否可能。有 _@Any 和 _@ManyToAny,但没有 _@OneToAny。这种映射的复杂性可能会阻止任何人实现它。如果你想一想——像 Hibernate 那样忽略泛型类型约束——这样一个集合的内容可能包含无限数量的不同类型,每个类型都由一个必须存在于某个地方的鉴别器指定。它肯定必须是使用连接表的关系,因为这是鉴别器必须存在的地方。
【解决方案2】:

我已经这样做了,但是有子类。

您的泛型类必须是抽象的,子类必须定义泛型参数

【讨论】:

  • 我理解那部分,但是像String 这样与继承树无关的对象类型呢?可以另外指定吗?
  • 我想说的是,只有当具有泛型定义的类没有保存在数据库中时,您才能指定泛型,因为休眠不知道要保存什么。您可以使用 targetEntity 字段来专门化它
猜你喜欢
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2018-07-06
  • 2023-03-18
  • 2014-10-16
  • 2012-01-17
  • 2015-03-13
相关资源
最近更新 更多