本文正在参加「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接口。 。