Использование спящего режима с дженериками

У меня возникли проблемы с пониманием того, как 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 s. Может ли Hibernate иметь дело с такой вещью?

Ответы

Ответ 1

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

Изменить:. Я создал пример выполнения в Github, основанный на вашем классе "Box", и используя сопоставление @Any. Вы можете просмотреть его (или 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

Ответ 2

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

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