我目前正在使用Eclipselink,但我知道现在大多数JPA实现已经非常标准化了。是否有将JPA实体映射到视图的本机方法?我不打算插入/更新,但问题是如何处理@Id注释。 JPA世界中的每个实体都必须有一个ID字段,但我创建的许多视图都不符合这一点。在JPA中是否存在本机支持,或者我是否需要使用hack才能使其工作?我搜索了很多,发现很少有关于这样做的信息。
答案 0 :(得分:8)
将@Id
注释与直接支持类型的字段一起使用并不是指定实体身份的唯一方法(请参阅@IdClass
多个@Id
注释或@EmbeddedId
@Embedded
),JPA规范要求每个实体都有一个主键。
也就是说,您不需要实体将JPA与数据库视图一起使用。由于映射到视图与从SQL透视图映射到表没有什么不同,您仍然可以使用本机查询(createNativeQuery
上的EntityManager
)来检索标量值。
答案 1 :(得分:0)
我自己一直在研究这个问题,而且我发现了一个黑客,我不是100%肯定的,但看起来很有希望。
在我的例子中,我在视图中有一个可以有效地充当PK的FK列 - 该外来对象的任何给定实例只能在视图中出现一次。我在一个字段中定义了两个对象:一个被指定为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个月后,你不再关心。 :-)到底是什么,“死灵法师”徽章不仅仅是为了自己赚钱......
答案 2 :(得分: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;