Использование спящего с дженериками - PullRequest
15 голосов
/ 09 августа 2011

У меня возникли проблемы с пониманием того, как 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 список ограничений того, что на самом деле может быть <T>.Я знаю, что вы можете указать такие вещи, как targetEntity=String.class выше t в аннотации, но тогда вы потеряете гибкость наличия дженериков.Могу ли я ограничить сферу применения общего аннотации?Например: что, если я хочу, чтобы классы ChildA, ChildB, которые наследуются от абстрактного класса Parent, были бы сохраняемыми там.Кроме того, он также должен быть в состоянии принять String с.Может ли Hibernate справиться с такой вещью?

Ответы [ 2 ]

14 голосов
/ 09 августа 2011

То, что вы ищете, это, вероятно, неявный полиморфизм Hibernate . Существует также малоизвестное «любое» отношение , которое дает полную гибкость, но имеет свои недостатки. Вы также можете использовать «any» в много-к-любому .

Редактировать: Я создал работающий пример на Github, основанный на вашем классе "Box" и использующий отображение @Any. Вы можете просмотреть его (или класс Box , в частности) или проверить его и запустить с помощью

git clone git://github.com/zzantozz/testbed tmp
cd tmp
mvn -q compile exec:java -Dexec.mainClass=rds.hibernate.AnyMapping -pl hibernate-any
5 голосов
/ 09 августа 2011

Я уже сделал это, но с подклассами.

Ваш универсальный класс должен быть абстрактным, а подклассы должны определять универсальный параметр

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...