【发布时间】:2020-11-05 14:48:32
【问题描述】:
能够成功地使用 wnwrap 会话将 SQL 计数从Entity 的 SELECT + UPDATE 减少到 UPDATE (带有 @DynamicUpdate 注释),但 DynamicUpdate 在这种情况下不起作用。
doInJPA(entityManager -> {
Session session = entityManager.unwrap( Session.class );
for ( Post post: posts ) {
session.update( post );
}
});
发现 @DynamicUpdate 仅在使用 entityManager.merge 模式进行更新时有效,但在分离状态 SELECT + UPDATE 时会导致 2 个 SQL 查询。
doInJPA(entityManager -> {
for ( Post post: posts ) {
entityManager.merge( post );
}
});
能否使会话展开模式使用 entityManager.merge 生成的 SQL UPDATE 查询,从而不必重新实现 DynamicUpdate ?
Note-
- 实体在
String数据类型上有@Id键,这是UUID.toString字段,不是生成的字段 - 尝试实现
Persistable和TransientisNew和getId没有成功(即无法将 SELECT + UPDATE 在entityManager.merge模式的情况下减少到仅更新) - 能够使用
entityManager.createNativeQuery.executeUpdate模式使用单个 INSERT 成功插入,只是更新正在使用合并模式触发双重查询。会话展开和更新将其减少到 1 个更新,但 DynamicUpdate 不起作用 - 也在更大范围内尝试了事务,因此 GET + UPDATE 在同一事务中没有成功
【问题讨论】:
标签: java spring-boot hibernate jpa spring-data