【问题标题】:Get Hibernate SessionFactory from JPA's entityManagerFactory从 JPA 的 entityManagerFactory 获取 Hibernate SessionFactory
【发布时间】:2018-08-10 23:43:38
【问题描述】:

我需要 Hibernate 的一个特定功能 StatelessSession,为此我需要 Hibernate 的 SessionFactory。问题是我只有 entityManagerFactory。在这种情况下如何获得 StatelessSession?

【问题讨论】:

    标签: hibernate jpa


    【解决方案1】:

    选项 1 到 EntityManagerFactory

    如果您使用Hibernate >= 4.3JPA 2.1,您可以从EntityManagerFactory<T> T EntityManagarFactory#unwrap(Class<T> cls) 访问SessionFactory

    SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
    

    选项 2 至 EntityManager

    如果您使用Hibernate >= 4.3JPA >= 2.0,那么您可以从EntityManager<T> T EntityManagar#unwrap(Class<T> cls) 访问Session。从Session你可以得到SessionFactory

    Session session = entityManager.unwrap(Session.class);
    SessionFactory sessionFactory = session.getSessionFactory();
    

    【讨论】:

    • 反之亦然?我有 SessionFactory 对象,但由于某种原因我需要 EntityManagar
    • @dom 不,这不可能。
    【解决方案2】:

    尝试将EntityManagerFactory 转换为HibernateEntityManagerFactory

    由于EntityManagerFactory 不支持unwrap()(与EntityManager 不同),它似乎是实现目标的唯一方法。

    【讨论】:

    • 对我来说工作得很好:HibernateEntityManagerFactory emFactory = (HibernateEntityManagerFactory) em.getEntityManagerFactory();
    • 由于 JPA 2.1 EntityManageFactory 现在提供了一个 unwrap() 方法。
    【解决方案3】:

    Hibernate >= 4.3 支持 JPA 2.1。所以你可以像 emf.unwrap(SessionFactory.class) 这样使用 EntityManagerFactory.unwrap。

    【讨论】:

    • 另一种解决方案是将 EntityManager 解包到 Session 中,然后从 session 中获取 SessionManager。这也适用于 jpa 2.0
    【解决方案4】:
    猜你喜欢
    • 2011-08-04
    • 2023-03-21
    • 2021-06-29
    • 1970-01-01
    • 2019-06-14
    • 2015-09-26
    • 2013-12-16
    • 2015-05-19
    相关资源
    最近更新 更多