有一种情况。例如,我正在设计一个简单的博客。有文章和照片。用户可以将他们的评论添加到他们两个。所以当我用 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;
}
Article
和 Photo
都将扩展 MyAbstractBaseClass
并实现接口(interface)。
JPA wikibook 有两个关于此主题的很好的部分,请参见下文。
资源
关于java - 如何在 JPA 中定义多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4044642/