我正在阅读JPA上的Stackoverflow中的一些帖子,我读了JPA不支持接口的多个地方.有人可以分享它在现实世界项目中的含义.这是否意味着我们无法注释界面?
Jam*_*mes 11
这意味着您无法在界面上进行映射(注释)或查询.您只能查询@Entity类,这些类只能放在实际类而不是接口上.通常这不是问题,接口没有状态,因此在大多数情况下不是与持久性真正相关的东西.您仍然可以在模型中使用接口,而不能直接映射它们.
如果您的关系使用接口类型,则只需将targetEntity设置为实现类.如果您有多个实施者但无法让他们共享继承,那么您需要获得更多创意.一些JPA提供程序(如EclipseLink)支持接口.
请参阅 http://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Interfaces
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就是解决方案