取消引用的休眠 (JPA) 实体会发生啥情况?
Posted
技术标签:
【中文标题】取消引用的休眠 (JPA) 实体会发生啥情况?【英文标题】:What happens to dereferenced hibernate (JPA) entities?取消引用的休眠 (JPA) 实体会发生什么情况? 【发布时间】:2011-03-25 00:43:07 【问题描述】:在我正在进行的一个项目中,我们有一个 EJB 后端,各种客户端远程连接(即 Web 层、Web 服务层等)。客户端在另一台机器上,可以在另一个数据中心,所以前端和后端永远不会在同一个应用服务器上。
后端分层如下:
SLSB 服务层对象 DAO
所有对象都是弹簧管理的,除了 SLSB。事件链如下:
初始化:
-
实体管理器注入 DAO
DAO 注入服务对象
注入 SL EJB 的服务对象
SLSB 仅提供远程接口
所有对象都是单例和无状态的
请求/响应:
在 EJB 上调用的方法,委托给服务对象,使用 DAO,返回 DTO
DAO 封装了对 JPA 实体的所有查询操作。没有 JPA 实体流过服务层。服务层划分事务。
使用此架构完成请求/响应生命周期后,JPA 实体会发生什么情况?服务层应该尝试缓存实体,还是休眠工作?
欢迎使用此架构的任何 cmets。
谢谢
比尔沃思【问题讨论】:
【参考方案1】:使用此架构完成请求/响应生命周期后,JPA 实体会发生什么情况?
对于 TRANSACTION 范围的容器管理的持久性上下文,当相关的 JTA 事务提交或回滚并且持久性上下文中的所有实体都被分离时,持久性上下文结束。来自 JPA 规范:
5.6.1 容器管理的事务范围持久化上下文
应用程序可以获得一个 容器管理的实体管理器 事务范围的持久化上下文 绑定到 JTA 事务 在 JNDI 中注入或直接查找 命名空间。持久性上下文 实体管理器的类型是 默认或定义为
PersistenceContextType.TRANSACTION
.一个新的持久化上下文开始于 容器管理的实体管理器 在范围内调用[36] 一个活跃的 JTA 事务,以及 当前没有持久性 已经与 JTA 交易。坚持 上下文被创建然后关联 与 JTA 交易。
持久化上下文结束时 关联的 JTA 事务提交或 回滚,并且所有实体 由 EntityManager 管理成为 分离。
如果实体管理器被调用 在交易范围之外, 从数据库加载的任何实体 将立即分离 方法调用结束。
如果应用程序不再持有引用,则分离的实体将被垃圾收集。
服务层是否应该尝试缓存实体,或者这是休眠工作?
如果您想在各种持久性上下文中缓存实体,也就是二级 (L2) 缓存,这是 JPA 提供者的工作。它知道各种持久性事件,并且可以与缓存进行适当的交互。当您的 JPA 提供者已经提供此功能时,在服务层级别实现类似机制是没有意义的。对于休眠,请参阅19.2. The Second Level Cache。
【讨论】:
感谢帕斯卡。我迫不及待地希望有一天能够下载和安装其他人的大脑。你的下载量会很大。以上是关于取消引用的休眠 (JPA) 实体会发生啥情况?的主要内容,如果未能解决你的问题,请参考以下文章
当我们在 C 中取消引用 NULL 指针时,操作系统会发生啥?