我正在阅读JPA上的Stackoverflow中的一些帖子,我读了JPA不支持接口的多个地方。有人可以分享它在现实世界项目中的含义。这是否意味着我们无法注释界面?
答案 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:
如果您认为需要多重继承,perhaps @Embeddable
is the solution
答案 2 :(得分:0)
您需要为您提供的接口或实现提供代理生成器。
您是否可以将链接发布到您正在考虑的SO答案中,以便我们可以获得完整的上下文?这可能有助于回答这个问题。