JPA 是否支持映射到 sql 视图?
我目前正在使用Eclipselink,但我知道现在大多数JPA实现已经非常标准化了。是否有将 JPA 实体映射到视图的本机方法?我不想插入/更新,但问题实际上是如何处理@Id注释。JPA 世界中的每个实体都必须有一个 ID 字段,但我创建的许多视图都不符合此要求。JPA中是否有对此的本机支持,或者我是否需要使用黑客才能使其正常工作?我搜索了很多,发现关于这样做的信息很少。
我目前正在使用Eclipselink,但我知道现在大多数JPA实现已经非常标准化了。是否有将 JPA 实体映射到视图的本机方法?我不想插入/更新,但问题实际上是如何处理@Id注释。JPA 世界中的每个实体都必须有一个 ID 字段,但我创建的许多视图都不符合此要求。JPA中是否有对此的本机支持,或者我是否需要使用黑客才能使其正常工作?我搜索了很多,发现关于这样做的信息很少。
虽然将注释与直接支持类型的字段一起使用并不是指定实体标识的唯一方法(请参阅多个注释或 with),但 JPA 规范要求每个实体都有一个主键。@Id
@IdClass
@Id
@EmbeddedId
@Embedded
也就是说,您不需要实体将 JPA 与数据库视图结合使用。由于映射到视图与从 SQL 角度映射到表没有什么不同,因此您仍然可以使用本机查询 ( on ) 来检索标量值。createNativeQuery
EntityManager
我自己一直在研究这个问题,我发现了一个黑客,我不是100%确定的作品,但看起来很有希望。
在我的例子中,我在视图中有一个 FK 列,它可以有效地充当 PK - 该异物的任何给定实例只能在视图中出现一次。我在一个字段中定义了两个对象:一个被指定为 ID 并表示字段的原始值,另一个被指定为只读并表示被引用的对象。
@Id
@Column(name = "foreignid", unique = true, nullable = false)
public Long getForeignId() {
...
@OneToOne
@JoinColumn(name = "foreignid", insertable=false, updatable=false)
public ForeignObject getForeignObject() {
...
就像我说的,我不是100%确定这个(如果它被证明不起作用,我会删除这个答案),但它让我的代码通过了一个特定的崩溃点。
不过,如果它适用于您的特定情况,则为Dunno。很有可能在11个月后,你不再关心。:-)到底是什么,那个“死灵法师”徽章不只是自己赚的。...