【问题标题】:Where to create a SessionFactory object in a web project?在 Web 项目中在哪里创建 SessionFactory 对象?
【发布时间】:2015-12-16 12:52:46
【问题描述】:

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

【问题讨论】:

  • 你使用的是哪个版本的休眠?
  • SessionFactory 与 JPA 无关。决定你正在使用什么...... JPA 或 Hibernate API

标签: hibernate jakarta-ee jpa sessionfactory


【解决方案1】:

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

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

传统 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 提供EclipseLinkTomEE 提供OpenJPA。您无需在这些服务器上手动安装 JPA 实现,但如有必要,您可以替换它。

SessionFactory 是 Legacy Hibernate 的一部分,而不是 JPA。 SessionFactory 从未出现在任何 JPA 教程中。这只能意味着您正在阅读错误或严重过时的资源来学习 JPA。也许您使用关键字“Hibernate”搜索了这些教程,而您应该使用关键字“JPA”搜索教程。 JPA 等效于 Legacy Hibernate 的 SessionFactoryEntityManagerFactory。而且,JPA 等效于 Legacy Hibernate 的 SessionEntityManager。你应该改用那些。

提供了一个真正的 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 自行管理所有内容,避免您一次又一次地重复相同的代码样板。

另见:

【讨论】:

  • 非常感谢您。我实际上是两种方式。令您惊讶的是,我对 Legacy Hibernate 感到满意,但是我确实发现 Session 对象有点奇怪,因为在其他 JPA 教程中我没有这些对象。
  • 另一个小问题,EntityManager 也可以在 Hibernate 中使用吧?
  • 如果你使用 Hibernate 的 JPA 实现,是的。然后具体的EntityManager 实例位于Hibernate 提供的掩护之下。看,它是像 JDBC 这样的一个和所有接口。
猜你喜欢
  • 2020-04-21
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 2017-07-28
  • 1970-01-01
  • 2011-08-14
  • 1970-01-01
相关资源
最近更新 更多