【问题标题】:Understanding a passage in `Pro JPA 2 Mastering the java Persistence API`?理解“Pro JPA 2 Mastering the java Persistence API”中的一段话?
【发布时间】:2018-03-25 10:20:30
【问题描述】:

我是JPA 的新手,我正在阅读Pro JPA 2 Mastering the java Persistence API 并且我已经阅读了以下段落:

如果 持久化提供者认为有必要。

我的问题

  • 什么是deems it necessary
  • 在哪些情况下提供者deems it necessary

我想详细了解这句话deems it necessary的意思。欢迎任何帮助,在此先感谢。

【问题讨论】:

  • 这意味着,行为取决于实现。提供者可以在“认为有必要”时刷新(但没有义务)。
  • @Henry 知道在我们的企业中我们使用EclipseLink 是否可以提供EclpiseLink 使用flush 时的案例的详细说明
  • 可能是的,如果您检查 EclipseLink 的源代码。但请记住,这可能会在未来的版本中发生变化。因此,您的应用程序不得依赖任何特定行为。
  • @Henry 知道刷新会影响结果,最好手动使用刷新(开发人员在代码中明确)还是将其留给提供者?
  • 过度使用 flush 会对性能产生负面影响。因此,通常最好将其留给提供商。当您需要手动刷新时,有一些罕见的例外情况。

标签: java jpa jpa-2.0


【解决方案1】:

一个这样的场景是根据JPA 2.1 Specification - Section 3.10.8 Queries and Flush Mode - The persistence provider is responsible for ensuring that all updates to the state of all entities in the persistence context which could potentially affect the result of the query are visible to the processing of the query.

虽然它依赖于实现,但您可以注意到下面的行为,hibernate 作为持久性提供者决定在触发 HQL 之前刷新,因为持久性上下文中的状态可能会影响查询结果。

因此,使用 Hibernate 作为持久性提供者,

  1. 打开一个 entityManager。
  2. 创建新的Employee 实体并在其上调用persist 方法。
  3. 它可能不会立即生成 insert 语句,因为会话充当缓存后的事务写入并尝试将刷新延迟到可能的最后一刻。
  4. 触发 JPQL 以获取 count of employees using the entityManager
  5. 此时,您会看到在触发select count(*) from employee JPQL 之前触发了插入语句以保留新创建的员工。

所以在这种情况下,它决定刷新状态,因为员工对象的插入可能会影响 JPQL 查询的结果。

【讨论】:

  • 据我了解,当涉及到flush 时,我们无法真正了解提供程序(休眠)的行为。知道flush会影响结果,最好手动使用flush(由开发人员在代码中明确)还是留给提供者?
  • 我会说把它留给提供商,除非您遇到需要手动刷新的用例,否则它将在何时刷新方面做出更明智的决定,我认为这应该是非常罕见的。我个人从来没有觉得需要手动冲洗。
猜你喜欢
  • 1970-01-01
  • 2018-05-07
  • 2016-03-26
  • 2017-09-09
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 2018-06-15
相关资源
最近更新 更多