0

我将 Spring Data JPA 与 Hibernate 一起使用。

我有一个复合键映射到数据库表的类。

当我使用 JPARepository 扩展接口对象执行保存操作时,我在控制台中看到以下日志:

Hibernate: select rolefuncti0_.functionalityId as function1_4_0_, rolefuncti0_.roleId as roleId2_4_0_ from RoleFunctionality_Mapping rolefuncti0_ where rolefuncti0_.functionalityId=? and rolefuncti0_.roleId=?
Hibernate: insert into RoleFunctionality_Mapping (functionalityId, roleId) values (?, ?)

这是我用相同的数据重复操作时看到的:

 Hibernate: select rolefuncti0_.functionalityId as function1_4_0_, rolefuncti0_.roleId as roleId2_4_0_ from RoleFunctionality_Mapping rolefuncti0_ where rolefuncti0_.functionalityId=? and rolefuncti0_.roleId=?

看来Spring Data首先检查数据库中是否存在Key,然后继续执行插入。

应该有一种方法可以捕获hibernate找到的信息(数据库条目/密钥存在于数据库中)?我们如何检查呢?

4

1 回答 1

0

没有这样的方法。Hibernate 不能确定主键是否存在,除非它自己发出一个 SQL 查询。Hibernate 假设这个检查是由应用程序逻辑完成的,以允许这成为性能优化的问题。

Hibernate 必须注意重复键问题的唯一机会是来自数据库(或 JDBC 层)的 SQLException,通知 id 字段的唯一约束违规。和往常一样,如果发生 SQLException,则应将 Hibernate 会话视为无效(因为考虑到拦截器和侦听器处理,Hibernate 无法确保有效状态)。

因此,发出额外查询的弹簧方式是可行的方法,除非您可以通过使用额外的计数器、批量获取和保留免费 ID 或使用应用程序范围的事件/消息传递来提供额外的逻辑来确保数据库中不存在密钥同步实体 ID 分配的解决方案。

于 2013-09-29T16:29:27.180 回答