Enterprise Java Bean(EJB) 和 Entity Java Bean 有什么区别?

What is the difference between Enterprise Java Bean(EJB) and Entity Java Bean?

谁能解释一下 Enterprise Java BeansEntity Java Bean 之间的区别?

我知道EJB 是什么,但我不明白它们在持久性方面的区别。

我们用同样的注解来保存,为什么叫法不一样呢?

过去,随着地球的形成,JavaEE 有两种基本的 Bean——会话 Bean 和实体 Bean。

会话 Bean 是某种内部服务的接口。大多数框架都有一些与会话 Bean 基本并行的东西。

实体 Bean 是由容器管理的持久元素。

当人们谈论 Java EE 时,尤其是当他们抱怨它时,Entity Beans 是一个核心问题。他们根本不是很好。

随着 Java 持久性架构 (JPA) 以及 Hibernate 和 EclipseLink 等框架的引入,Java EE 对托管持久性的看法发生了巨大的变化。我们不再有 "heavyweight" 实体 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。这些都是第一个 class EJB,代表 Java EE 组件模型的核心。 EJB 在运行时最显着的方面是它们如何与容器内管理的本地事务 space 进行交互。此外,EJB 是 EJB 容器内的可部署构造,类似于 WAR。 (它们也是其他东西,这很难详尽。)

JPA 实体不是 EJB。他们没有交易背景。关于它们是否由实体管理器主动管理,它们具有不同的状态。实体管理器在本地事务中注册 space(因此 JPA 管理的实体也是通过代理)。

最后,随着 CDI,以及注解的兴起,EJB 直接嵌入 WARs,区分 EJB 本身的界限一天比一天模糊。