Pri*_*jee 5 java ejb java-ee-7
谁能解释一下Enterprise Java Beans和Entity Java Bean之间的区别?
我知道 EJB 是什么,但我不明白它们在持久性方面的区别。
我们使用相同的注解来保存它,但那为什么叫它不同呢?
在过去,随着地球的形成,Java EE 有两种基本类型的 Bean——会话 Bean 和实体 Bean。
Session Bean 是某种内部服务的接口。大多数每个框架都有一些与 Session Bean 的基本并行。
实体 Bean 是由容器管理的持久元素。
当人们谈论 Java EE 时,尤其是当他们抱怨它时,实体 Bean 是一个核心问题。他们只是不太好。
随着 Java Persistence Architecture (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 本身的界限每天都变得越来越模糊。