1

我有一个没有主键的数据库视图。它有一组列,用于唯一标识视图中的一行,但其中三列可以是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.

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

4

2 回答 2

5

JPA 规范说Entity 类必须具有唯一的、不可变的 ID

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

于 2017-10-19T18:17:43.953 回答
0

并非所有实体都有符合 JPA 定义的 PK。有几种方法可以解决它,所有这些都是hacky。

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

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

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

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

于 2017-10-19T21:56:44.247 回答