EJB 3.0和JPA之间的关系是什么?

20

这似乎很明显,但我看到了矛盾的说法:JPA是否是EJB 3.0的一部分?我不是专家,这让我感到相当困惑。

如果是这样,JPA是否操纵实体Bean?这些实体bean是持久层和使用无状态bean实现逻辑的业务层之间的接口吗?

对我来说,根本问题是如何实现“基于各种条件搜索用户”的功能,其中“搜索”请求 -其字符串表示- 应该如何构建?我的意思是,如果JPA不是EJB的一部分,则我的bean不应该知道数据模型,对吧?

边界在哪里?

4个回答

18
是和不是。是因为声称实现EJB 3.0规范的每个应用服务器都必须提供JPA实现。否,因为JPA可以轻松地在独立应用程序或Spring管理的应用程序中使用。 在EJB 3.0之前,Entity Beans是一种可怕的想法。 JPA使用术语“entities”来区别于其耻辱的历史。但是,JPA entities是将数据库表映射到普通Java对象的一种方式。原则上,对对象所做的更改会传播到数据库,反之亦然(过于简化)。
正如我所说,JPA不依赖于EJB(被视为无状态和有状态会话bean),反之亦然。但是,并没有阻止您在EJB中使用JPA。
在您的场景中,您将拥有一个无状态EJB构建查询,并通过JPA与数据库进行交互。严格来说,您将在您的bean中调用注入的EntityManager的方法:
@Stateless
public class SearchService {

    @PersistenceContext
    private EntityManager em;

    public List<User> findUsersBornAfter(Date date) {
        return em.
            createQuery("SELECT u FROM User u WHERE u.birthDate > :birthDate ORDER BY name").
            setParameter("birthDate", date).
            getResultList();
    }
}

如您所见,业务层显然知道数据模型,但是就实体而言并没有依赖于EJB/业务服务。在这个例子中,JPQL(查询)在服务层中形成,User是一个JPA实体。调用getResultList()会导致JPA提供程序将JPQL转换为SQL,运行查询并将结果转换回User对象实例。

现在EJB和JPA之间的边界清晰了吗?


无状态 EJB 在搜索方法中嵌入了 JPQL 吗?而且,JPQL 没有在持久层中分离吗? - LB40
1
我不一定理解你的问题,但我更新了我的示例,这样有帮助吗? - Tomasz Nurkiewicz
3
你是否更愿意将出生日期存储在数据库中,而不是年龄?或者你有每日脚本来更新整张表的年龄吗?[/挑剔] ;) - BalusC
不要争论,事实证明“修复”一个示例更快、更容易 ;-). 谢谢。 - Tomasz Nurkiewicz
谢谢你更新的示例...现在更清楚了..我必须找到一种基于任意选择标准构建查询的方法...(如果我们只提供名字或名字和姓氏).. - LB40
2
@LB 在 JPA 2.0/Java EE 6 中有相应的 Criteria API 可供使用。 - Arjan Tijms

10

以下是一些注意事项:

  • 在JSR方面,JPA 1.0是EJB 3.0的一部分。 请参见此处 ,而JPA 2.0是一个独立的JSR (请参见此处)
  • “实体bean”是EJB 3.0之前的版本,它们已经过时了。它们被JPA所取代。
  • 在依赖关系方面,JPA不依赖于EJB,而EJB也不依赖于JPA。然而,EJB 可以处理注入JPA实体管理器。
  • 您可以单独使用其中任何一个。
  • 每个应用服务器都支持两种技术。

4

在 BalusC 的回答之上,引用自维基百科——企业级 JavaBean:

注意,当前的 EJB 3.1 规范并没有详细说明应用服务器如何提供持久化(这是委托给 JPA 规范来完成的任务),而是详细说明业务逻辑如何轻松地与应用服务器提供的持久化服务集成。

这种集成从 JPA 中消除了一些痛点,具体来说是相当繁琐和嘈杂的启动事务、提交/回滚事务以及定位 扩展持久性上下文(仅适用于有状态会话 Bean)。

此外,补充 Bozho 的回答:

  • 在 EJB 3.0 中,JPA 1.0 是 EJB 的子规范,可以在 EJB 之外、Java EE 之外使用。
  • 在 EJB 3.1 中,JPA 已经完全独立于 EJB,JPA 2.0 是一个完全分离的 JSR。

1

来自维基百科 - Java持久化API:

企业JavaBean

EJB 3.0规范(本身是Java EE 5平台的一部分)包括了Java持久化API的定义。然而,最终用户不需要EJB容器或Java EE应用服务器即可运行使用此持久化API的应用程序。[1] Java持久化API的未来版本将在单独的JSR和规范中定义,而不是在EJB JSR/规范中。 Java持久化API取代了EJB 2.0 CMP(容器管理持久性)的持久化解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接