【发布时间】:2016-11-17 22:50:16
【问题描述】:
谁能解释一下Enterprise Java Beans和Entity Java Bean之间的区别?
我知道 EJB 是什么,但我不明白它们在持久性方面的区别。
我们使用相同的注解来保存它,但是为什么叫它不同呢?
【问题讨论】:
谁能解释一下Enterprise Java Beans和Entity Java Bean之间的区别?
我知道 EJB 是什么,但我不明白它们在持久性方面的区别。
我们使用相同的注解来保存它,但是为什么叫它不同呢?
【问题讨论】:
在过去,随着地球的形成,Java EE 有两种基本的 Bean——会话 Bean 和实体 Bean。
会话 Bean 是某种内部服务的接口。大多数框架都与 Session Bean 有一些基本的相似之处。
Entity Bean 是由容器管理的持久元素。
当人们谈论 Java EE 时,尤其是当他们抱怨它时,实体 Bean 是一个核心问题。他们根本就不是很好。
随着 Java 持久性架构 (JPA) 以及 Hibernate 和 EclipseLink 等框架的引入,Java EE 的托管持久性观点发生了巨大变化。我们不再有实体 Bean 等“重量级”构造,而是由 JPA 管理的轻量级 POJO。
然而,令人困惑的是,由 JPA 管理的对象被称为实体。 JPA 实体和 EJB 实体 Bean 是完全不同的动物。但是该术语的重复使用会造成混淆。
有了 EJB Entity Bean,EJB 和 Entity 是一回事。实体 EJB 是一个 EJB,就像一个会话 Bean。
但是,JPA 实体不是。从技术上讲,实体与 EJB 完全无关。 JPA 实体管理器集成在 EJB 运行时上下文中(通过投影,由该实体管理器管理的任何实体都是 EJB 运行时上下文的一部分),但不需要在 EJB 容器中使用 JPA。它们是独立的技术。也就是说,它们在 EJB 容器中确实可以很好地工作。
所以。
今天,实体 EJB 仍然存在,但已被弃用,并且有一天会消失。但是容器仍然支持它们。除非你有一些遗留代码,否则没有理由去关心他们。除了实体 Bean,Java EE 还支持:无状态会话 Bean、有状态会话 Bean 和消息驱动 Bean。这些都是代表 Java EE 组件模型核心的一流 EJB。 EJB 在运行时最值得注意的方面是它们如何与容器内管理的本地事务空间进行交互。此外,EJB 是 EJB 容器内的可部署构造,类似于 WAR。 (它们也是其他东西,这并不详尽。)
JPA 实体不是 EJB。他们没有交易上下文。它们有不同的状态,关于它们是否由它们的实体管理器主动管理。实体管理器在本地事务空间中注册(因此 JPA 管理的实体也通过代理注册)。
最后,随着 CDI、注释的兴起、将 EJB 直接嵌入到 WAR 中,区分 EJB 本身的界限每天都变得越来越模糊。
【讨论】: