这似乎很明显,但我看到了矛盾的说法:JPA是否是EJB 3.0的一部分?我不是专家,这让我感到相当困惑。
如果是这样,JPA是否操纵实体Bean?这些实体bean是持久层和使用无状态bean实现逻辑的业务层之间的接口吗?
对我来说,根本问题是如何实现“基于各种条件搜索用户”的功能,其中“搜索”请求 -其字符串表示- 应该如何构建?我的意思是,如果JPA不是EJB的一部分,则我的bean不应该知道数据模型,对吧?
边界在哪里?
这似乎很明显,但我看到了矛盾的说法:JPA是否是EJB 3.0的一部分?我不是专家,这让我感到相当困惑。
如果是这样,JPA是否操纵实体Bean?这些实体bean是持久层和使用无状态bean实现逻辑的业务层之间的接口吗?
对我来说,根本问题是如何实现“基于各种条件搜索用户”的功能,其中“搜索”请求 -其字符串表示- 应该如何构建?我的意思是,如果JPA不是EJB的一部分,则我的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之间的边界清晰了吗?
在 BalusC 的回答之上,引用自维基百科——企业级 JavaBean:
注意,当前的 EJB 3.1 规范并没有详细说明应用服务器如何提供持久化(这是委托给 JPA 规范来完成的任务),而是详细说明业务逻辑如何轻松地与应用服务器提供的持久化服务集成。
这种集成从 JPA 中消除了一些痛点,具体来说是相当繁琐和嘈杂的启动事务、提交/回滚事务以及定位 扩展持久性上下文
(仅适用于有状态会话 Bean)。
此外,补充 Bozho 的回答:
来自维基百科 - 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(容器管理持久性)的持久化解决方案。