java - 如何在 JPA 中定义多态性

标签 java database-design jpa polymorphism

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

public interface Commentable { ... }

public class Article implements Commentable { ... }

public class Photo implements Commentable { ... }

public class Comment { 
   ...
   private Commentable commentTo; 
}

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

有什么办法可以在不改变设计的情况下坚持下去吗?非常感谢

最佳答案

Is there any way how to persist it without changing of design, please? Thanks a lot

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

对于标准 JPA,通常的方法是使用抽象类(有或没有您的接口(interface))并使用继承。例如(保留界面):

public class Comment { 
   ...
   @OneToOne(targetEntity=MyAbstractBaseClass.class)
   private Commentable commentTo; 
}

ArticlePhoto 都将扩展 MyAbstractBaseClass 并实现接口(interface)。

JPA wikibook 有两个关于此主题的很好的部分,请参见下文。

资源

关于java - 如何在 JPA 中定义多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4044642/

相关文章:

java - "No persistence unit with name ' 产品 ' found"

Java 进程 getInputStream 与 getOutputStream

java - iText 7 - 将 PDF 图层 (OCG) 与基础 PDF 合并

Java:Char 中的赋值

database-design - 从事 IT 业务开发软件、网站和数据库的新公司从哪里找到工作?

单列下有多个子列的Excel表的Mysql DB表结构

java - Spring JPA Repository - 在服务器重启时保留数据

java - 请解释*贪婪量词的工作原理

php - “跟随”或 'Subscribe' 方法

java - 为什么从 jndi.properties 注入(inject)后在 JNDI 中找不到数据源?