Java 关闭entityManager的最佳方法
我有以下代码: 我正在处理控制器中的异常,但我想确保实体管理器已关闭。我不喜欢我接住并重新抛出错误。我希望能找到更好的建议Java 关闭entityManager的最佳方法,java,jpa,entitymanager,Java,Jpa,Entitymanager,我有以下代码: 我正在处理控制器中的异常,但我想确保实体管理器已关闭。我不喜欢我接住并重新抛出错误。我希望能找到更好的建议 谢谢最好的办法就是不必在意它。如果您的实体管理器是容器管理的(例如,如果您使用的是ejb或spring,并且您没有强制执行特定的bean/应用程序管理行为),那么您应该让容器处理事务的打开/关闭,并且通常需要担心您的持久性上下文。它更容易、更安全,而且排除了非常特殊的情况,效果更好。只有在应用程序管理的上下文的情况下,才能直接手动关闭实体管理器,以避免连接池耗尽或其他问题
谢谢最好的办法就是不必在意它。如果您的
实体管理器
是容器管理的(例如,如果您使用的是ejb
或spring
,并且您没有强制执行特定的bean/应用程序管理行为),那么您应该让容器处理事务的打开/关闭,并且通常需要担心您的持久性上下文。它更容易、更安全,而且排除了非常特殊的情况,效果更好。只有在应用程序管理的上下文的情况下,才能直接手动关闭实体管理器
,以避免连接池耗尽或其他问题。只需删除捕获即可。如果关闭/打开entityManager,则可能无法使用entityManager提供的缓存和其他机制。但是,您可以只删除代码中的catch部分,并在其他地方引发的异常上放置某种类型的异常处理程序。如果我只删除catch,异常仍将传播到调用类?如果出现finally
块,您可以尝试使用Java8-resource@vegaasen:您是否建议我打开entityManager
?我应该为每个会话保留一个吗?使用Spring数据后,我现在明白了
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();
}
}