将休眠与泛型一起使用

2022-09-03 01:44:03

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

我几乎可以肯定这是因为我没有给冬眠一个实际限制的列表。我知道你可以在注释中指定诸如上述内容,但是这样你就会失去拥有泛型的灵活性。我是否可以使用注释来限制可接受的泛型的范围?例如:如果我希望从抽象类继承的类 ,在那里可以持久化,该怎么办?此外,它还应该能够接受s。能处理这样的事情吗?<T>targetEntity=String.classtChildAChildBParentStringHibernate


答案 1

你要找的可能是Hibernate的隐式多态性。还有一种鲜为人知的“任何”关系,它提供了完全的灵活性,但它有其权衡。您还可以在多对任意中使用“任何”。

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

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

答案 2

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

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


推荐