【发布时间】:2015-09-26 07:51:03
【问题描述】:
- 我在 SQL 数据库中有没有明显主键(复合或其他)的视图
- 我想通过 JPA 访问它们
我读到我应该能够像对待表一样对待 JPA 中的视图(使用 @Table 注释等)。但是,如果没有主键,我必须有效地从每一列中生成一个复合键(事实上,这是 Hibernate 的逆向工程工具默认执行的操作)。
但是,如果我这样做,会有不良的副作用。 例如
-
必须编写所有指向主键属性而不是视图的代码:
myViewObject.getPrimaryKey().getFirstName()
-
无法在 spring 存储库上使用“findBy...”方法(因为该属性是视图“标识符”的一部分,而不是它的属性之一)。
李>
我的问题是:如何在这样的环境中映射视图,因为我可以使用 JPA 轻松访问它们的属性?
注意:我很高兴被告知我使用了完全错误的方法。这似乎是一个常见的问题,一定会有更好的解决方案。
【问题讨论】:
-
我采用的一个技巧是分析视图上可能的查询,以查看有多少有可能返回多条记录,并查看在所有这些情况下是否存在对所有记录保持唯一的字段。如果你能找到这样的场景,你可以将该字段指定为主键,即使它不是真正的主键,因为 ORM 只关心单个查询结果之间的唯一性。但请注意,您将无法使用二级缓存。如果此技巧不适用,我会修改视图的查询以包含主键。
-
没有什么可以阻止您编写诸如
getFirstName()之类的委托方法,而return this.getPrimaryKey().getFirstName()。然后你只需要写一次长版本。至于错误的方法,我们的应用程序中有超过 400 个实体/表,我们没有一个视图实体。我尝试使用一次,因为我认为它会有所帮助,但它开始引起问题,所以我在 JPQL 中创建了相同的“视图”,它完成了同样的工作,并且给了我更多的灵活性。
标签: java spring hibernate jpa sql-view