在@Transactional方法中间调用Hibernate flush()是否有可能将不完整的结果保存在数据库中? 例如,此功能是否可以将“ John”保存到数据库?
@Transactional
public void tt() {
Student s = new Student("John");
em.persist(s);
em.flush();
// Perform some calculations that change some attributes of the instance
s.setName("Jeff");
}
我在H2内存数据库中进行了尝试,但没有保存不完整的交易更改。但是在某些情况下,也许在另一个数据库引擎上,这可能吗?
答案 0 :(得分:1)
在致电em.commit()
或交易结束之前,它不应保存任何内容。我发现的最佳解释是来自here。下面是基本摘录:
此操作将导致DML语句(插入/更新/删除等)被执行到数据库,但当前事务不会被提交。这意味着flush()不会使当前更改对其他EntityManager实例或其他外部数据库客户端可见;那只会在事务提交时发生。换句话说,flush()操作只会将当前的内存缓存从EntityManager刷新到数据库会话。
因此刷新可能会引发一些JPA异常,但实际上不会在事务结束之前提交给数据库。