EJB 3.0和JPA之间的关系?

LB4*_*B40 17 ejb jpa java-ee ejb-3.0

这看起来很明显,但我看到了相互矛盾的陈述:JPA是EJB 3.0的一部分吗?我不是专家,对我来说很困惑.

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

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

边界在哪里?

Tom*_*icz 16

JPA是EJB 3.0的一部分吗?

是和否...... 是的,因为声称实现EJB 3.0规范的每个应用程序服务器也必须提供JPA实现.不,因为JPA可以很容易地在EJB之外,在独立应用程序或Spring管理的应用程序中.

JPA操纵实体豆?

实体bean在3.0之前的EJB中是一个可怕的想法.JPA使用术语实体来区分可耻的历史.但是,JPA实体是一种将数据库表映射到普通Java对象的方法.原则上,对对象的更改会传播到数据库,反之亦然(过度简化).

正如我所说,JPA对EJB(被视为无状态和有状态会话bean)没有任何依赖性,反之亦然.但是没有什么能阻止你在EJB中使用JPA.

在您的场景中,您将拥有一个无状态EJB构建查询并通过JPA与数据库交互.从技术上讲,您将调用EntityManager注入到bean的方法:

@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();
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样,业务层(显然)知道数据模型,但就实体而言,不依赖于EJB /业务服务.在此示例中,JPQL(查询)在服务层中形成,并且User是JPA实体.调用getResultList()会导致JPA提供程序将JPQL转换为SQL,运行查询并将结果转换回User对象实例.

EJB和JPA之间的边界现在是否清晰?

  • 难道你宁愿把生日存在于DB而不是年龄?或者你有每日脚本来更新整个年龄?[/ nitpick];) (3认同)
  • @LB是JPA 2.0/Java EE 6中的Criteria API. (2认同)

Boz*_*zho 9

几个笔记:

  • 说到JSR,JPA 1.0是EJB 3.0的一部分.看到这里,JPA 2.0是一个单独的JSR(见这里)
  • "实体bean"是EJB 3.0之前的版本,它们很幸运地死了.它们由JPA继承.
  • 当涉及到依赖项时 - JPA不依赖于EJB,而EJB不依赖于JPA.但是,EJB 可以处理JPA实体管理器的注入
  • 你可以单独使用其中任何一个
  • 每个应用程序服务器都支持