hibernate - 何时使用 EntityManager.clear()?

标签 hibernate orm

自定义 JPA 映射器类有一个方法:

removeUser()

1. execute 'DELETE' HQL query to remove user
2. call getEntityManager().flush();
3. call getEntityManager().clear();

如果我正确理解clear(),它将从上下文中删除所有持久实体。 -source

但是,我也读过here ,

you should define clear architecture- and design guidelines about where a 
clear() can be called. 

关于何时调用clear()的明确指南是什么?

最佳答案

文章对此进行了解释。清除实体管理器会清空其关联的缓存,强制稍后在事务中执行新的数据库查询。当使用事务绑定(bind)的实体管理器时,几乎不需要清除实体管理器。我认为有两个原因需要清除:

  • 在进行批处理时,为了避免巨大的缓存吃掉内存并由于长时间的脏检查而增加刷新时间
  • 当您执行 DML 或 SQL 查询时,这完全绕过实体管理器缓存(如您的示例中所示)。在这种情况下,由于查询,缓存保存的状态不会反射(reflect)数据库中的内容,因此您需要清除缓存以避免这种不一致。

关于hibernate - 何时使用 EntityManager.clear()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13886608/

相关文章:

c# - Dapper 可以处理可为空的 bool /位字段吗? [无效的]

symfony - 从现有数据库创建实体

python - Django,我的 TabularInline 中有许多重复的查询

python - SQLAlchemy:加入没有 from 字段的子查询

java - Hibernate 约束在级联保存时失败

hibernate - 如何在运行时更改 hibernate 映射属性

sql - 每个子类的表与 hibernate 中每个具体类的表?

java - JPA Hibernate 意外获取 @OneToOne 映射实体的记录,我应该将映射更改为 @ManyToOne 还是执行其他操作?

java - 部署 WildFly 期间的持久性单元名称问题

hibernate - 我可以仅使用ID设置实体关系吗?