一尘不染

将Hibernate与泛型一起使用

hibernate

我在理解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;
  }
}

在进行hibernate初始化时,出现异常: ...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一些<T>可能的限制条件。我知道你可以指定的东西,如targetEntity=String.class上面t的注释,但你失去使用泛型的灵活性。我可以使用注解限制可接受的泛型的范围吗?例如:如果我想要class
ChildAChildB该类从抽象类继承而来Parent,在那里可以持久化呢?另外,它也应该能够接受String。能Hibernate处理这样的事情吗?


阅读 423

收藏
2020-06-20

共1个答案

一尘不染

您正在寻找的可能是Hibernate的隐式多态性。还有一个鲜为人知的“任何”关系可以提供完全的灵活性,但是它有一些折衷。您还可以在多对多中使用“任意” 。

编辑: 基于您的“
Box”类并使用@Any映射,我已经在Github上创建了一个可运行的示例。您可以浏览(或专门用于Box类)或将其签出并运行

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