Ответ 1
Аннотации JPA не поддерживаются на интерфейсах. Из Java Persistence with Hibernate (стр .210):
Обратите внимание, что спецификация JPA не поддерживает аннотацию отображения по интерфейсу! Это будет разрешено в будущей версии Спецификация; когда вы читаете это книги, возможно, это будет возможно с аннотациями Hibernate.
Возможным решением было бы использовать абстрактный объект с стратегией наследования 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 (и, на самом деле, я считаю, что стойкие классы должны быть конкретными).