在 Web 项目中的哪里创建 SessionFactory 对象?

Where to create a SessionFactory object in a web project?

我正在学习 web 开发,到目前为止,有 about 、EJB、JSTL 和 JPA (Hibernate)。我知道 SessionFactory 对象应该在项目中作为 Singleton 只初始化一次。我很困惑如何初始化这个对象。将初始化此对象的代码保存在哪里?

你不需要。至少,不是在带有 EJB 和 JPA 的真实 Java EE 环境中。

您似乎混淆了“Legacy Hibernate”和 JPA。以前,当 JPA 不存在时,Hibernate 作为事实上的 ORM 标准。这是“Legacy Hibernate”,这些天您仍然可以在很多旧的或业余教程中看到它,主要是与 Java EE 的长期竞争对手 Spring 结合使用。您只会在后面看到像 SessionFactorySession 这样的老式东西。

旧版 J2EE 用户想要 unify/standardize Java EE API 中的“ORM”。 Hibernate 专家 Gavin King 被雇来做所有的 JPA 工作。 JPA 是根据从 Hibernate 中吸取的教训设计的。自从 JPA 被添加到 Java EE 5(2006 年就已经!),Hibernate 也提供了一个 JPA 实现。 JPA 就像 good ol' JDBC 一个抽象 API,任何人都可以为其提供实现(在 good ol' JDBC 中,这些被称为“JDBC 驱动程序”)。

Hibernate 不是唯一的 JPA 实现,其他 JPA 实现是 EclipseLink 和 OpenJPA。成熟的 Java EE 容器已经提供了开箱即用的 JPA 实现。 JBoss WildFly provides Hibernate, while GlassFish provides EclipseLink and TomEE provides OpenJPA。您不需要在这些服务器上手动安装 JPA 实现,但如果需要,您可以替换它。

SessionFactory 是 Legacy Hibernate 的一部分,而不是 JPA。 SessionFactory 从未在任何 JPA 教程中显示。这只能意味着您阅读了错误的或严重过时的资源来学习 JPA。也许您使用关键字“Hibernate”搜索那些教程,而您应该使用关键字“JPA”搜索教程。 Legacy Hibernate 的 SessionFactory 的 JPA 等价物是 EntityManagerFactory. And, the JPA equivalent of Legacy Hibernate's Session is EntityManager。你应该改用那些。

提供了一个真实的 Java EE 环境,persistence.xml 设置为 transaction-type="JTA",你需要做的只是注入 EntityManager通过 EJB class.

中的 @PersistenceContext

例如,@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,也无需手动 start/commit/rollback 用户交易等。 Java EE 容器将通过 EJB 和 JTA 自行管理所有内容,避免您一次又一次地重复相同的代码样板。

另请参阅:

  • Oracle's official JPA tutorial
  • What exactly is Java EE?
  • When is it necessary or convenient to use Spring or EJB3 or all of them together?
  • Creating master-detail pages for entities, how to link them and which bean scope to choose