【问题标题】:JPA find and update strategyJPA 查找和更新策略
【发布时间】:2023-03-16 19:50:01
【问题描述】:

在我的 JPA 实现中,我执行 em.find() 来选择对象列表并修改这些对象。接下来,我在事务(TX)中调用 em.merge() 更新这些修改后的对象,以便保留其他对象相关的东西)。

这很好用,除了 SELECT 发生两次(一次在 find 期间,另一次在其他期间),我觉得这在我的情况下是多余的和性能杀手。

我不愿意将 find() 带入 em.merge() 的事务边界内,即使这样做会解决后一个 SELECT。

定义我自己的 NamedQuery 是在不发出另一个 SELECT 的情况下更新这些对象的唯一方法吗?

谢谢

【问题讨论】:

  • 你能指定第二个 SELECT 发生在哪里吗?
  • 为什么你不愿意将 find() 调用带入你的 tran 中?您使用的是什么提供商?
  • @Rick Select 需要几分钟来执行(因为非索引列查询)。 Select 执行的额外时间使事务超时(JBOSS 限制为 5 分钟)。我可能会增加时间,但将此作为最后的选择。
  • @perissf 在调用 merge() 期间发生第二次选择
  • 在您的情况下,我会考虑重组数据库架构的可能性

标签: jpa find entitymanager named-query


【解决方案1】:

如果您使用的是 JTA 托管的 EntityManager,那么每个事务边界将是一个新的持久性上下文,除非您配置了共享缓存,否则您将不得不返回数据库。

您使用的是哪个 JPA 提供程序?如果您使用的是 EclipseLink,则默认启用共享缓存。

对于 JPA 事务,如果您使用相同的 EntityManager 进行查找和合并,那么它应该仍然在持久化上下文中。

【讨论】:

  • 我使用 Hibernate 作为 JPA 提供程序。在我的代码中,Entitiymanager 被定义为 DAO 中的一个实例变量。在包含业务逻辑的 bean 中使用 @EJB 引用 DAO。在这里,我调用 dao.find() 和 dao.merge() 。这是否意味着我为每个 dao 调用使用不同的 EM?
猜你喜欢
  • 1970-01-01
  • 2012-11-16
  • 2012-01-27
  • 1970-01-01
  • 2011-01-17
  • 2016-08-16
  • 2021-12-29
  • 1970-01-01
  • 2010-10-29
相关资源
最近更新 更多