取消引用的休眠 (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 指针时,操作系统会发生啥?

取消引用指针会复制它吗?

JPA 2.0:在 JPA 2.0 中使用 javax.validation.* 包的例外情况

域对象是不是与 JPA 实体相同?

jpa pagingandsortingrepository啥情况会过滤条件查询