没有实体主键的 JPA 地图视图

JPA map view with no primary key to an entity

我有一个没有主键的数据库视图。它有一组列,可以唯一标识视图中的一行,但其中三个列可以是 null。我已经尝试基于这四列创建一个具有复合主键的实体,但是当从视图中检索数据时,我收到此错误:

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

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

JPA 规范规定,实体 class 必须具有唯一且不可变的 ID

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

并非所有实体都具有符合 JPA 定义的 PK。有几种解决方法,所有方法都很老套。

1) 修改视图以将字段(用合理值替换空值)合并为一个字段,并将其映射为 PK

2) 使用属性转换器功能将空值替换为合理的值,然后您可以映射复合 PK。

3) 使用 RowID 作为 PK(只有当您长期不依赖 PK 时才可以,因为 RowID 不能保证在运行之间保持一致。

我确定还有其他类似的解决方法,但我使用了 1 和 2,并探索了使用 3。