【发布时间】:2021-09-15 00:30:51
【问题描述】:
我正在尝试使用 HQL 更新表并希望将刷新模式设置为手动。我尝试了两种方法。
// Update user via session
em.unwrap(Session.class).createQuery("update User u set u.numRecords =:numRecords where u.id = 1")
.setParameter("numRecords", new Random().nextInt(1234567))
.setHibernateFlushMode(FlushMode.MANUAL)
.executeUpdate();
// Update user via entity manager.
Query query = em
.createQuery("update User u set u.numRecords =:numRecords where u.id = 1")
.setParameter("numRecords", new Random().nextInt(1234567));
((QueryImpl) query).setFlushMode(FlushMode.MANUAL).executeUpdate();
我的调用者调用这两种方法如下 -
@Transactional
public void foo() {
userRepository.updateUserViaSession();
userRepository.clear();
}
@Transactional
public void foo2() {
userRepository.updateUserViaEntityManager();
userRepository.clear();
}
实体 -
@Entity
@Table(name = "users")
public class User {
@Id
private Long id;
private String email;
private int numRecords;
private int numAllowedRecords;
}
问题是当我调用 foo() 或 foo2() 时,Hibernate 会立即刷新更新,而不是等待我显式调用 flush()。为什么会这样?
【问题讨论】:
-
我猜
@Transactional注释强制刷新。此外,您没有显示userRepository.clear()方法的实现。 -
userRepository.clear() 正在调用 em.clear()。 @Transactional 只会在最后强制刷新。但在此之前我会调用 clear(),所以 flush() 应该什么都不做。但 DB 实际上正在更新。无论如何,我可以从数据库日志中看到,刷新实际上是在事务中间发生的,这很奇怪,因为它是手动的。
-
这很奇怪,从来没有遇到过这样的问题。 . .我知道这听起来可能有点愚蠢,并且可能不适合您的用例,但是您是否尝试过直接在 Session 和 EntityManager 中将刷新模式设置为
MANUAL,而不是设置为查询?同样,我知道这可能听起来有点愚蠢,可能不适合您的需求,但请尝试一下并检查是否会发生同样的问题。
标签: spring-boot hibernate