Hibernate和Jpa中都有持久化上下文的概念(Persistence context),持久化上下文其实就是Hibernate和JPA的一级缓存,通过在持久化上下文中存储持久化状态实体的快照,既可以进行脏检测,并且持久化上下文还可以当做持久化实体的缓存。虽然Hibernate作为JPA的超集,Hibernate3.2之后实现了JPA,但是两者对持久化上下文的管理有一定的同,下面比较如下:
1.Hibernate是将Persistence context绑定到session中,当session关闭的时候,persistence context也就关闭了。而对于session来说,Hibernate又可以根据具体情况分别绑定到Thread和JTA事务。如果 Hibernate采用JDBC事务的话,那么采用ThreadLocal来实现Thread绑定,如果采用JTA事务的话,则可以将session绑定到JTA事务上。
2.JPA里持久化上下文分为两种情况:
(1)如果采用application-managed,那么应用程序来管理所需资源(比如数据库等),此时持久化上下文是绑定到当前session的,也就是绑定到EntityManager.
(2)如果采用容器管理的话,那么持久化上下文又分为两种:
1)事务范围的持久化上下文。对于事务的持久化上下文来说,每次当stateless bean与EJB object绑定的时候,容器会注入EntityManger,这样EntityManager和事务都是容器管理的。每次方法调用默认启动事务,方法调用结束后,结束事务。当事务结束的时候,与当前EntityManager关联的持久化上下文也就随之关闭。此种情况下不需要手动关 EntityManager。因为容器会在事务提交或者回滚后,自动关闭EntityManager.
2)扩展的持久化上下文,扩展的持久化上下文是针对与statefull bean来说的,此时持久化上下文的生命周期和statefull bean的生命周期是一致的。每次方法调用结束后,EntityManager关闭了,但是持久化上下文没有关闭,这样以来当事务结束的时候持久化上下文中的对象仍然处于持久化状态,所以在跨方法调用时候,就不需要merge操作了。
1.Hibernate是将Persistence context绑定到session中,当session关闭的时候,persistence context也就关闭了。而对于session来说,Hibernate又可以根据具体情况分别绑定到Thread和JTA事务。如果 Hibernate采用JDBC事务的话,那么采用ThreadLocal来实现Thread绑定,如果采用JTA事务的话,则可以将session绑定到JTA事务上。
2.JPA里持久化上下文分为两种情况:
(1)如果采用application-managed,那么应用程序来管理所需资源(比如数据库等),此时持久化上下文是绑定到当前session的,也就是绑定到EntityManager.
(2)如果采用容器管理的话,那么持久化上下文又分为两种:
1)事务范围的持久化上下文。对于事务的持久化上下文来说,每次当stateless bean与EJB object绑定的时候,容器会注入EntityManger,这样EntityManager和事务都是容器管理的。每次方法调用默认启动事务,方法调用结束后,结束事务。当事务结束的时候,与当前EntityManager关联的持久化上下文也就随之关闭。此种情况下不需要手动关 EntityManager。因为容器会在事务提交或者回滚后,自动关闭EntityManager.
2)扩展的持久化上下文,扩展的持久化上下文是针对与statefull bean来说的,此时持久化上下文的生命周期和statefull bean的生命周期是一致的。每次方法调用结束后,EntityManager关闭了,但是持久化上下文没有关闭,这样以来当事务结束的时候持久化上下文中的对象仍然处于持久化状态,所以在跨方法调用时候,就不需要merge操作了。