10.0 Hibernate SessionFactory与JPA EntityManagerFactory区别| Java Debug 笔记

616 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>

提问:Hibernate SessionFactory与JPA EntityManagerFactory区别是什么?

我是Hibernate的新手,我不确定是使用HibernateSessionFactory还是JPAEntityManagerFactory来创建Hibernate Session。

两者有什么区别?使用这些功能的优点和缺点是什么?

回答1:

SessionFactory 与 EntityManagerFactory

正如我在《Hibernate用户指南》中所解释的那样,HibernateSessionFactory扩展了JPA EntityManagerFactory.因此,SessionFactory也是JPA EntityManagerFactory。

无论是SessionFactory与EntityManagerFactory都包含实体映射元数据,并允许您创建一个HibernateSession或EntityManager。

Session 与 EntityManager

就像SessionFactory和EntityManagerFactory一样,Hibernate会话扩展了JPA EntityManager。 因此,由EntityManager定义的所有方法在Hibernate Session中都可用。

会话和实体管理器将实体状态转换为SQL语句,例如SELECT,INSERT,UPDATE和DELETE。

Hibernate 与 JPA bootstrap

引导JPA或Hibernate应用程序时,有两种选择:

您可以通过Hibernate本机机制进行引导,并通过BootstrapServiceRegistryBuilder创建一个SessionFactory。 如果您使用的是Spring,则Hibernate引导程序是通过LocalSessionFactoryBean完成的。 或者,您可以通过Persistence类或EntityManagerFactoryBuilder创建JPA EntityManagerFactory。 如果您使用的是Spring,则通过LocalContainerEntityManagerFactoryBean完成JPA引导,如此GitHub示例所示。

这边推荐的是通过JPA引导。 这是因为与传统的FlushMode.AUTO相比,JPA FlushModeType.AUTO是更好的选择,前者破坏了本机SQL查询的读写一致性。

将JPA展开为Hibernate

另外,如果您通过JPA进行引导,并且已经通过@PersistenceUnit注释注入了EntityManagerFactory:

@PersistenceUnit
private EntityManagerFactory entityManagerFactory;

您可以使用unwrap方法轻松访问底层的Sessionfactory:

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

使用JPA EntityManager可以完成相同的操作。 如果通过@PersistenceContext注释注入EntityManager:

@PersistenceContext
private EntityManager entityManager;

您可以使用unwrap方法轻松访问会话:

Session session = entityManager.unwrap(Session.class);

结论 因此,您应该通过JPA进行引导,使用EntityManagerFactory和EntityManager,并且仅当您想访问JPA中不可用的某些特定于Hibernate的方法时(例如,通过其自然标识符来获取实体),才将它们解包到其关联的Hibernate接口。 。