Я хочу сохраниться, мой litte зоопарк с Будьте в спящем режиме:
@Entity
@Table(name = "zoo")
public class Zoo {
@OneToMany
private Set<Animal> animals = new HashSet<Animal>();
}
// Just a marker interface
public interface Animal {
}
@Entity
@Table(name = "dog")
public class Dog implements Animal {
// ID and other properties
}
@Entity
@Table(name = "cat")
public class Cat implements Animal {
// ID and other properties
}
То, когда я пытаюсь сохранить зоопарк, Быть в спящем режиме, жалуется:
Use of @OneToMany or @ManyToMany targeting an unmapped class: blubb.Zoo.animals[blubb.Animal]
Я знаю о targetEntity
- свойство @OneToMany
но это означало бы, только Собаки ИЛИ Кошки могут жить в моем зоопарке.
Там какой-либо путь состоит в том, чтобы сохранить набор интерфейса, который имеет несколько реализаций, с В спящем режиме?
Аннотации JPA не поддерживаются в интерфейсах. Из Java Persistence with Hibernate (стр.210):
Обратите внимание, что спецификация JPA не поддерживает никаких аннотаций отображения на интерфейсе! Это будет решено в будущей версии спецификации; когда вы будете читать эту книгу, это, вероятно, будет возможно с помощью аннотаций Hibernate.
Возможным решением было бы использование абстрактного Entity с TABLE_PER_CLASS
стратегией наследования (потому что вы не можете использовать сопоставленный суперкласс - который не является сущностью - в ассоциациях). Что-то вроде этого:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class AbstractAnimal {
@Id @GeneratedValue(strategy = GenerationType.TABLE)
private Long id;
...
}
@Entity
public class Lion extends AbstractAnimal implements Animal {
...
}
@Entity
public class Tiger extends AbstractAnimal implements Animal {
...
}
@Entity
public class Zoo {
@Id @GeneratedValue
private Long id;
@OneToMany(targetEntity = AbstractAnimal.class)
private Set<Animal> animals = new HashSet<Animal>();
...
}
Но нет особых преимуществ в сохранении интерфейса IMO (и вообще, я думаю, что постоянные классы должны быть конкретными).
Я догадываюсь, что вам нужно отображение дерева наследования. Аннотации @Inheritance - это то, что вам нужно. Не знаю, будет ли это работать с интерфейсами, но с абстрактными классами точно будет.
Я думаю, что вы должны аннотировать интерфейс также @Entity
и мы должны аннотировать @Transient
на все геттеры и сеттеры интерфейса.