如何在JPA中定义多态性

Gai*_*aim 5 java polymorphism database-design jpa

有一种情况.例如,我正在设计简单的博客.有文章和照片.用户可以将他们的评论添加到他们两个.所以当我用Java编写它时,它看起来像这样:

public interface Commentable { ... }

public class Article implements Commentable { ... }

public class Photo implements Commentable { ... }

public class Comment { 
   ...
   private Commentable commentTo; 
}
Run Code Online (Sandbox Code Playgroud)

这很清楚,我希望设计是正确的.但现在我想将它保存在数据库中,我想使用JPA注释.主要是我必须使用JPA 1.0,但如果没有解决方案,我想知道如何在JPA 2.0中使用它.我发现有一种经典继承的方法,但我认为Commentable不应该是这些对象的父级,它只是根据设计的扩展.

有没有办法如何在不改变设计的情况下坚持下去,拜托?非常感谢

Pas*_*ent 8

请问如何在不改变设计的情况下坚持下去?非常感谢

JPA并不真正支持您的设计(确切地说,如果存在单个实现,您可以映射指向接口的关系,但这不是您的情况).您的JPA提供程序可能对此有一些支持(例如EclipseLink有一个@VariableOneToOne注释).

使用标准JPA,通常的方法是使用抽象类(使用或不使用您的接口)并使用继承.例如(保持界面):

public class Comment { 
   ...
   @OneToOne(targetEntity=MyAbstractBaseClass.class)
   private Commentable commentTo; 
}
Run Code Online (Sandbox Code Playgroud)

在哪里ArticlePhoto将扩展MyAbstractBaseClass和实现接口.

JPA wikibook在这个主题上有两个很好的部分,见下文.

资源