Java 如何在JPA中定义多态性

Java 如何在JPA中定义多态性,java,database-design,jpa,polymorphism,Java,Database Design,Jpa,Polymorphism,有一种情况。例如,我正在设计简单的博客。有文章和照片。用户可以将他们的评论添加到两者中。所以当我用Java编写它时,它看起来是这样的: public interface Commentable { ... } public class Article implements Commentable { ... } public class Photo implements Commentable { ... } public class Comment { ... privat

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

public interface Commentable { ... }

public class Article implements Commentable { ... }

public class Photo implements Commentable { ... }

public class Comment { 
   ...
   private Commentable commentTo; 
}
这很清楚,我希望设计是正确的。但现在我想将其持久化到数据库中,并希望使用JPA注释。首先,我必须使用JPA1.0,但如果没有解决方案,我想知道如何在JPA2.0中使用它。我发现经典继承有一种方法,但我认为Commentable不应该是这些对象的父对象,它只是设计方面的扩展

请问有没有办法在不改变设计的情况下坚持下去?非常感谢

请问,有没有办法在不改变设计的情况下坚持下去?非常感谢

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

对于标准JPA,通常的方法是使用抽象类(带或不带接口)和继承。例如(保留接口):

其中,
Article
Photo
都将扩展
MyAbstractBaseClass
并实现接口

JPA维基百科有两个关于这个主题的好章节,见下文

资源
  • JPA维基百科:

谢谢,我知道使用抽象类的解决方案,但我希望还有另一个。基类定义id?那么所有commantable都有相同的ID生成器?
public class Comment { 
   ...
   @OneToOne(targetEntity=MyAbstractBaseClass.class)
   private Commentable commentTo; 
}