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