JPA不支持接口良好..implications?

Ara*_*ram 6 java jpa

我正在阅读JPA上的Stackoverflow中的一些帖子,我读了JPA不支持接口的多个地方.有人可以分享它在现实世界项目中的含义.这是否意味着我们无法注释界面?

Jam*_*mes 11

这意味着您无法在界面上进行映射(注释)或查询.您只能查询@Entity类,这些类只能放在实际类而不是接口上.通常这不是问题,接口没有状态,因此在大多数情况下不是与持久性真正相关的东西.您仍然可以在模型中使用接口,而不能直接映射它们.

如果您的关系使用接口类型,则只需将targetEntity设置为实现类.如果您有多个实施者但无法让他们共享继承,那么您需要获得更多创意.一些JPA提供程序(如EclipseLink)支持接口.

请参阅 http://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Interfaces

  • 最简单的方法是定义一个AbstractAddress类并使用JPA继承.否则,如果您使用的是EclipseLink,则可以使用@VariableOneToOne映射进行映射.你也可以让Person有一个canadianAddress,ukAddress等. (3认同)

Sea*_*oyd 10

在JPA,使用@MappedSuperclass了继承,注释抽象类,而不是接口.

我倾向于为给定项目中的所有实体使用公共基类:

@MappedSuperclass
public abstract class BaseEntity implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
}
Run Code Online (Sandbox Code Playgroud)

现在让我们说我的一些实体有其他共同的行为:自动更新createdDate和updatedDate的时间戳

@MappedSuperclass
public abstract class ExtendedEntity extends BaseEntity{

    @Temporal(TemporalType.TIMESTAMP)
    private Date createdDate;

    @Temporal(TemporalType.TIMESTAMP)
    private Date updatedDate;

    @PrePersist
    protected void creationTimeStamp(){
        createdDate = new Date();
        this.updateTimeStamp();
    }

    @PreUpdate
    protected void updateTimeStamp(){
        updatedDate = new Date();
    }

}
Run Code Online (Sandbox Code Playgroud)

现在,我的一些实体BaseEntity直接扩展,其他实体扩展ExtendedEntity(如果它们需要时间戳).

您还可以配置继承建模的方式:

  • 每个类层次结构的单个表
  • 每个具体实体类的表(默认)
  • 一种"连接"策略,其中特定于子类的字段或属性映射到与父类共有的字段或属性不同的表

顺便说一句:我认为不支持接口的选择很好.接口旨在模拟行为,而不是状态.JPA是关于管理状态而不是行为,所以这两个概念并不合适.

如果您认为需要多重继承,也许@Embeddable就是解决方案