EJB和JPA如何相关?

我正在阅读Action 3中的EJB 3,我有以下问题:
您是否使用@Entity编写和注释POJO,以及EJB实体类型?

我不明白JPA与EJB有什么关系。 JPA现在不是一个自己的规范吗? 实体也包含在自己的持久性容器中。 他们谈论EJB 3 Java Persistence API等,但我不明白实体与EJB有什么关系。

JPA旨在取代EJB2实体bean,并已作为EJB3规范的一部分启动。

由于在EJB容器之外也使用JPA是有意义的,它现在有自己的规范,但它仍然与EJB3相关,因为兼容的EJB3容器必须提供JPA实现,该实现集成到容器的事务处理中。

在EJB规范的2.1版之前,实体bean类必须实现javax.ejb.EntityBean接口,并为样板方法提供实现,例如ejbLoad,ejbStore,ejbActivate和ejbPassivate。

EJB 3.0采用了JPA规范。 实体bean的概念被更简单的JPA实体概念所取代。 要创建此类实体,不需要任何接口实现或样板方法。 该实体是具有@Entity注释的POJO。

因此,实际上,从EJB 3开始,Java EE应用程序中“实体bean”EJB的使用已经死亡(埋藏在JPA下)。

你是对的。 JPA除了支持EJB之外还有更多工作要做。 这就是为什么JPA成为一个单独的JSR或规范的原因。 EJB在其规范中使用或允许使用JPA,因为JPA是一个很好的标准。 如果设计正确,您现在可以在JPA供应商之间切换而无需更改代码。

EJB规范可以独立于JPA使用(尽管JPA已作为EJB规范的一部分包含在内),同样JPA可用于EJB规范之外的更多内容。 尽管如此,EJB规范可以非常轻松地将JPA Entitiy Manager(及其用法)注入到bean中,从而使编程更容易。 当然,现在可以使用CDI上的新JSR轻松实现:-)。

所有支持EJB规范的应用服务器,也应该支持JPA。 您可以查看此主题以获取更多信息。