JPA 2.0规范(JSR 317)说:什么是JPQL查询和JPA持久化上下文环境中的批量更新?
The persistence context is not synchronized with the result of the bulk update or delete.
究竟是什么一个散装更新?
在我看来,[或更确切地说应该是]“批量更新”和“定期更新”之间的区别。我想相信批量更新是更新多个实体的更新。因此,应该有一个更新没有归类为“批量”,这是一项只针对一个实体的更新操作。在这种情况下,该操作是否更新第一级缓存是非常重要的。
该规范从来没有解决这个问题,或给出了“批量更新”表达式的明确定义。我也不能在这个主题上找到任何其他来源。我尽我所能测试应用程序托管的资源本地实体管理器(使用EclipseLink 2.3.2.v20111125-r10461),并且可以确认持久性上下文确实已过时,即使我们执行仅针对一个实体的更新查询。 JPA提供者也没有调用我附加到测试类的实体监听器。
我在阅读JPA 2.0规范后认为,这只适用于“批量更新”,即针对具有受影响行的多个实体的更新查询大于1。但是,通过前面描述的测试结果我开始认为没有像“定期更新”那样的东西,所有更新查询是“批量更新”。
这个故事告诉我们,如果这是真的,是只推缓存的内容时,我们做EntityManager#find
,EntityManager#merge
,EntityManager#remove
和JPQL选择查询(Query#getResultList
和Query#getSingleResult
)。但是,如果我们执行了JPQL更新或删除查询(Query#executeUpdate
),我们应该而不是推高速缓存。为了Java EE新手的好处,应该添加它,以使其他应用程序进程和直接数据库调用(JDBC)也可以使缓存失效。无论这是真的还是不行,还有一件事我不明白:
这是什么设计,为什么不应该JPA提供同步持久化上下文和/或他的二级缓存背后的原理是什么?我的第一个猜测是性能方面的原因,但是再次,我不知道。
如果你知道任何东西,给我!
Downvoter保健佳品他的推理? – 2014-04-23 08:34:41