2014-09-19 128 views
-1

我在我的SpringMVC应用程序中使用休眠JPA。我对这段代码EntityManager和休眠会话

@PersistenceContext 
    protected EntityManager entityManager; 

现在这个EntityManager的是要住我的应用程序的整个生命对其进行初始化。 EntityManager的hibernate实现 正在封装一个hibernate会话。如果你愿意,你可以打开它。当我们在没有JPA的情况下使用纯粹的hibernate时。我们打开会话完成我们的工作并关闭会话。如果EntityManager在后台打开时以及关闭时使用hibernate的会话。如果它在应用程序的整个生命周期中保持单一会话不会造成问题,因为实体不会自动驱逐?它可能导致内存不足的错误?

+0

阅读此:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/orm/jpa/JpaTransactionManager.html – 2014-09-19 13:25:19

回答

0

我会尽量回答所有问题(根据我的经验和期望),但我敢肯定它真的取决于你是否有JTA事务或UserTransactions工作(又名本地资源的事务):

如果EntityManager在后台打开时以及关闭时使用hibernate的会话?

对于EntityManager的每个实例,打开一个新的hibernate会话。如果您使用JTA事务,则当事务关闭时(当您的第一个服务bean方法返回时),entityManager会关闭。

如果它在整个应用程序的整个生命周期中保持一个会话将不会 因为实体不会自动驱逐它会产生问题吗?它 可能会导致内存不足错误?

它不保留单个休眠会话。如果你这样配置,它将有一个可重用连接池,但是对于每个新创建的bean,它都会生成一个新的实体管理器,并在其后面有一个新的Hibernate会话。

+0

对于事务我只是使用@Transactional注释。没有做任何事情,我的应用程序不是很大,只有一个分区工作 – faisalbhagat 2014-09-19 13:59:34

+0

因此,当spring管理事务时,它会在事务完成后关闭会话吗? – faisalbhagat 2014-09-19 14:06:57

+0

是的,这是JTA的情况。 – 2014-09-19 14:29:08