没有主键的JPA映射视图到实体

问题描述:

我有没有主键的数据库视图。它有一组唯一标识视图中的一行的列,但其中三列可以是null。我试图创建基于这些四列的复合主键的实体,而是从视图中检索数据时出现此错误:没有主键的JPA映射视图到实体

The primary key read from the row ... during the execution of the query was detected to be null. Primary keys must not contain null. 

有什么我可以做,例如,添加自动生成列定义视图时?

+0

是的,你可以添加一个自动编号,它将工作阅读,但更新....你将需要测试。 – Namphibian

JPA规范说明实体类必须具有唯一的不可变ID

从逻辑上讲,如果它没有任何主键,就不能称为实体。您可以改为创建VIEW的POJO表示,然后执行SQL Native查询,然后将结果集映射到您的POJO。 下面是使用@SqlResultSetMapping/@ConstructorResult http://www.thoughts-on-java.org/result-set-mapping-constructor-result-mappings/

并非所有的实体都适合JPA定义的PK样品。有几种方法可以解决这个问题,他们都是黑客。

1)修改视图的字段(代与有意义的值的空值)组合成一个场,并映射,作为一个PK

2)使用的属性转换器功能与合理的值,以取代空值,则可以映射组合PK。

3)使用行ID为PK(这是​​确定唯一的,如果你不依赖于PK的任何长期看,随着的rowid不存在保证留下来运行之间是一致的。

我敢肯定有是其他类似的解决方法,但我已经使用1和2,并使用3探索。