解除引用的hibernate(JPA)实体会发生什么?

时间:2010-08-04 00:54:31

标签: hibernate orm jpa ejb dao

在我正在开发的项目中,我们有一个EJB后端,其中各种客户端远程连接(即Web层,Web服务层等)。客户端位于另一台计算机上,可以位于另一个数据中心,因此前端和后端永远不会位于同一个应用服务器中。

后端分层如下:

SLSB< - >服务层对象< - > DAO

除SLSB外,所有对象都是弹簧管理的。事件链如下:

初​​始化:

  1. 实体经理注入DAO
  2. DAO注入服务对象
  3. 注入SL EJB的服务对象
  4. SLSB仅提供远程接口 所有对象都是Singleton和无状态
  5. 请求/响应:

    在EJB上调用的方法,委托给服务对象,使用DAO,返回DTO

    DAO封装了JPA实体上的所有查询操作。没有JPA实体渗透过服务层。服务层划分了事务。

    使用此架构完成请求/响应生命周期后,JPA实体会发生什么?服务层是否应该尝试缓存实体,还是休眠作业?

    欢迎任何关于这种架构的评论。

    谢谢

    • Billworth

1 个答案:

答案 0 :(得分:2)

  

使用此架构完成请求/响应生命周期后,JPA实体会发生什么?

对于TRANSACTION作用域的容器管理持久性上下文,持久性上下文在关联的JTA事务提交或回滚并且分离了持久性上下文中的所有实体时结束。从JPA规范:

  

5.6.1容器管理的事务范围持久化上下文

     

申请可以获得   容器管理的实体管理器   事务范围的持久化上下文   绑定到JTA事务   在JNDI中注入或直接查找   命名空间。持久化上下文   实体管理器的类型是   违约或定义为   PersistenceContextType.TRANSACTION

     

新的持久化上下文从何时开始   容器管理的实体管理器   在范围内调用 [36]   一个活跃的JTA交易,和   没有当前的持久性   上下文已经与   JTA交易。坚持不懈   创建上下文然后关联   与JTA交易。

     

持久化上下文在结束时结束   关联的JTA事务提交或   回滚,以及所有实体   由EntityManager管理成为   分离。

     

如果调用实体管理器   在交易范围之外,   从数据库加载的任何实体   将立即脱离   方法调用的结束。

如果应用程序不再保留引用,则将分离实体进行垃圾回收。

  

服务层是否应该尝试缓存实体,还是休眠作业?

如果要在各种持久性上下文(即二级(L2)缓存)中缓存实体,那么这就是JPA提供者的工作。它知道各种持久性事件,并且可以与缓存进行适当的交互。当您的JPA提供程序已经提供此功能时,在服务层级别实现类似的机制是没有意义的。对于Hibernate,请参阅19.2. The Second Level Cache