【问题标题】:Best way to close an entityManager关闭 entityManager 的最佳方法
【发布时间】:2018-03-16 06:19:11
【问题描述】:

我有以下代码:

    public Category findCategoryById(Long id) {
      EntityManager em = emf.createEntityManager();
      try {
          em.getTransaction().begin();
          Category category = categoryDAO.findCategoryById(em, id);
          em.getTransaction().commit();
          return category;
      } catch (Exception e) {
          throw e;
      } finally {
          em.close();
    }
  }

我正在处理我的控制器中的异常,但我想确保实体管理器已关闭。我不喜欢我捕捉并重新抛出错误。我希望能找到更好的建议。

谢谢

【问题讨论】:

  • 只需取下锁扣即可。 finally 子句在没有它的情况下运行。
  • 如果您关闭/打开 entityManager,您可能无法使用 EntityManager 提供的缓存和其他机制。但是,您可以只删除代码中的 catch 部分,并在其他地方抛出异常时放置某种异常处理程序。
  • 如果我只是去掉catch,异常还会传播到调用类吗? finally 块的存在?
  • 也许你可以试试Java8 Try-with-resource
  • @vegaasen:你是在建议我让entityManager 保持打开状态吗?我应该为每个会话保留一个吗?

标签: java jpa entitymanager


【解决方案1】:

最好的方法是不必关心它。如果您的Entity Manager容器管理(例如,如果您使用ejbspring 并且您没有强制执行特定的bean/应用程序管理行为)您应该让容器处理事务的打开/关闭,并且通常担心您的持久性上下文。它更容易,更安全,并且在排除非常特定的情况下会更好。 Entity Manager 的手动关闭只有在应用程序管理上下文的情况下应该由您直接处理,以避免连接池耗尽或其他问题。

【讨论】:

  • 使用Spring Data后,我现在明白了
猜你喜欢
  • 2013-04-01
  • 2016-05-26
  • 2013-05-27
  • 2012-01-15
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多