JPA不支持接口..implications?
我正在浏览JPA上的Stackoverflow中的一些post,我读了JPA不支持接口的多个地方。 有人可以分享它在现实世界项目中的含义。 这是否意味着我们无法注释界面?
这意味着您无法在界面上进行映射(注释)或查询。 您只能查询@Entity类,这些类只能放在实际类而不是接口上。 通常这不是问题,接口没有状态,因此在大多数情况下不是与持久性真正相关的东西。 您仍然可以在模型中使用接口,您无法直接映射它们。
如果您的关系使用接口类型,则只需将targetEntity设置为实现类。 如果您有多个实施者但无法让他们共享inheritance,那么您需要获得更多创意。 一些JPA提供程序(如EclipseLink)支持接口。
请参阅http://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Interfaces
在JPA中, 使用@MappedSuperclass
进行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
(如果它们需要时间戳)。
您还可以配置inheritance建模的方式 :
- 每个类层次结构的单个表
- 每个具体实体类的表(默认)
- 一种“连接”策略,其中特定于子类的字段或属性映射到与父类通用的字段或属性不同的表
顺便说一句:我认为不支持接口的选择很好。 接口旨在模拟行为,而不是状态。 JPA是关于管理状态而不是行为,所以这两个概念并不合适。
如果您认为需要多重inheritance, 也许@Embeddable
是解决方案
您需要为您提供的接口或实现生成代理生成器。
您是否可以将链接发布到您正在考虑的SO答案中,以便我们可以获得完整的上下文? 这可能有助于回答这个问题。