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

时间:2010-11-17 13:34:54

标签: java jpa

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

3 个答案:

答案 0 :(得分:11)

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

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

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

答案 1 :(得分:10)

在JPA中,use @MappedSuperclass for inheritance注释抽象类,而不是接口。

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

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

现在让我们说我的一些实体有其他共同的行为:自动更新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();
    }

}

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

您还可以配置the way the inheritance is modeled

  • 每个类层次结构的单个表
  • 每个具体实体类的表(默认)
  • “连接”策略,其中特定于子类的字段或属性映射到与父类通用的字段或属性不同的表
BTW:我认为不支持接口的选择很好。接口旨在模拟行为,而不是状态。 JPA是关于管理状态而不是行为,所以这两个概念并不合适。

如果您认为需要多重继承,perhaps @Embeddable is the solution

答案 2 :(得分:0)

您需要为您提供的接口或实现提供代理生成器。

您是否可以将链接发布到您正在考虑的SO答案中,以便我们可以获得完整的上下文?这可能有助于回答这个问题。