JPA是否支持映射到sql视图?

问题描述 投票:32回答:3

我目前正在使用Eclipselink,但我知道现在大多数JPA实现已经非常标准化了。是否有将JPA实体映射到视图的本机方法?我不打算插入/更新,但问题是如何处理@Id注释。 JPA世界中的每个实体都必须有一个ID字段,但我创建的许多视图都不符合这一点。在JPA中是否存在本机支持,或者我是否需要使用hack才能使其工作?我搜索了很多,发现很少有关于这样做的信息。

java sql orm jpa view
3个回答
9
投票

虽然将@Id注释与直接支持类型的字段一起使用并不是指定实体标识的唯一方法(请参阅带有多个@IdClass注释的@Id或带有@EmbeddedId@Embedded),JPA规范要求每个实体使用主键。

也就是说,您不需要实体将JPA与数据库视图一起使用。由于映射到视图与从SQL透视图映射到表没有什么不同,您仍然可以使用本机查询(createNativeQuery上的EntityManager)来检索标量值。


0
投票

我自己一直在研究这个问题,而且我发现了一个黑客,我不是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个月后,你不再关心。 :-)到底是什么,“死灵法师”徽章不仅仅能获得自己......


0
投票

在我看来,我有一个“唯一”ID,所以我将其映射为实体ID。它工作得很好:

@Entity
@Table(name="table")
@NamedQuery(name="Table.findAll", query="SELECT n FROM Table n")
public class Table implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="column_a")
    private int columnA;
© www.soinside.com 2019 - 2024. All rights reserved.