你不需要。至少,不是在具有 EJB 和 JPA 的真正 Java EE 环境中。
您似乎混淆了“传统休眠”和 JPA。以前,当 JPA 不存在时,Hibernate 作为事实上的 ORM 标准。这就是“Legacy Hibernate”,如今您仍然可以在许多旧的或业余的教程中看到它,主要是结合 Java EE 的长期竞争对手 Spring。你只会在里面看到像 SessionFactory 和 Session 这样的老式东西。
传统 J2EE 用户希望统一/标准化 Java EE API 中的“ORM”。 Hibernate 的家伙 Gavin King 被聘请来做所有的 JPA 工作。 JPA 是根据从 Hibernate 中吸取的经验设计的。由于 JPA 被添加到 Java EE 5 中(2006 年已经添加了!),Hibernate 也提供了 JPA 实现。 JPA 就像优秀的 JDBC 一样,是一个抽象 API,任何人都可以为其提供实现(在优秀的 JDBC 中,这些被称为“JDBC 驱动程序”)。
Hibernate 不是唯一的 JPA 实现,其他 JPA 实现是 EclipseLink 和 OpenJPA。成熟的 Java EE 容器已经提供了开箱即用的 JPA 实现。 JBoss WildFly 提供Hibernate,而GlassFish 提供EclipseLink,TomEE 提供OpenJPA。您无需在这些服务器上手动安装 JPA 实现,但如有必要,您可以替换它。
SessionFactory 是 Legacy Hibernate 的一部分,而不是 JPA。 SessionFactory 从未出现在任何 JPA 教程中。这只能意味着您正在阅读错误或严重过时的资源来学习 JPA。也许您使用关键字“Hibernate”搜索了这些教程,而您应该使用关键字“JPA”搜索教程。 JPA 等效于 Legacy Hibernate 的 SessionFactory 是 EntityManagerFactory。而且,JPA 等效于 Legacy Hibernate 的 Session 是 EntityManager。你应该改用那些。
提供了一个真正的 Java EE 环境,其中 persistence.xml 设置为 transaction-type="JTA",您只需通过 @PersistenceContext 在 EJB 类中注入 EntityManager 即可。
例如,@Entity public class Product 的虚拟服务:
@Stateless
public class ProductService {
@PersistenceContext
private EntityManager em;
public Product find(Long id) {
return em.find(Product.class, id);
}
public List<Product> list() {
return em.createQuery("SELECT p FROM Product p", Product.class).getResultList();
}
public void create(Product product) {
em.persist(product);
}
public void update(Product product) {
em.merge(product);
}
public void delete(Product product) {
em.remove(em.contains(product) ? product : em.merge(product));
}
}
就是这样,真的。无需维护EntityManagerFactory,也无需手动启动/提交/回滚用户事务等。 Java EE 容器将通过 EJB 和 JTA 自行管理所有内容,避免您一次又一次地重复相同的代码样板。
另见: