接口上不支持JPA批注。从 Java Persistence with Hibernate (p.210):
请注意,JPA规范在接口上不支持任何映射注释!这将在规范的将来版本中解决。当您阅读本书时,Hibernate Annotations可能是可能的。
一种可能的解决方案是将抽象实体与
TABLE_PER_CLASS继承策略一起使用(因为您不能在关联中使用映射的超类-不是实体)。像这样:
@Entity@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)public abstract class AbstractAnimal { @Id @GeneratedValue(strategy = GenerationType.TABLE) private Long id; ...}@Entitypublic class Lion extends AbstractAnimal implements Animal { ...}@Entitypublic class Tiger extends AbstractAnimal implements Animal { ...}@Entitypublic class Zoo { @Id @GeneratedValue private Long id; @oneToMany(targetEntity = AbstractAnimal.class) private Set<Animal> animals = new HashSet<Animal>(); ...}但是保留接口IMO并没有太多优势(实际上,我认为持久性类应该是具体的)。
参考文献
- 注释,继承和接口
- 在一对多关系中使用MappedSuperclass
- 与MappedSuperclass的多态关联会引发异常



