Hibernate SessionFactory vs. JPA EntityManagerFactory

我是Hibernate的新手,我不确定是使用Hibernate还是JPA来创建Hibernate。SessionFactoryEntityManagerFactorySession

这两者之间有什么区别?使用它们中的每一个的利弊是什么?


答案 1

首选和 。它们由 JPA 标准定义。EntityManagerFactoryEntityManager

SessionFactory并且是特定于休眠的。调用后台的休眠会话。如果您需要一些在 中不可用的特定功能,则可以通过调用以下命令来获取会话:SessionEntityManagerEntityManager

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

答案 2

SessionFactory断续器EntityManagerFactory

正如我在休眠用户指南中所解释的那样,休眠扩展了 JPA,如下图所示:SessionFactoryEntityManagerFactory

JPA and Hibernate relationship

因此,这也是一个JPA。SessionFactoryEntityManagerFactory

和 都包含实体映射元数据,并允许您创建休眠或 .SessionFactoryEntityManagerFactorySessionEntityManager

Session断续器EntityManager

就像 and 一样,休眠扩展了 JPA。因此,由 定义的所有方法都可以在 休眠 中使用。SessionFactoryEntityManagerFactorySessionEntityManagerEntityManagerSession

和 'EntityManager 将实体状态转换转换为 SQL 语句,如 SELECT、INSERT、UPDATE 和 DELETE。Session

休眠 vs. JPA 引导

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

  1. 您可以通过Hibernate本机机制进行引导,并通过BootstrapServiceRegistryBuilder创建一个。如果您使用的是Spring,则Hibernate引导是通过,如GitHub示例所示。SessionFactoryLocalSessionFactoryBean
  2. 或者,您可以通过 Persistence 类或 EntityManagerFactoryBuilder 创建 JPA。如果您使用的是 Spring,则 JPA 引导是通过 完成,如 GitHub 示例所示。EntityManagerFactoryLocalContainerEntityManagerFactoryBean

通过 JPA 进行自举是首选。这是因为JPA是一个比传统更好的选择,它打破了本机SQL查询的读写一致性FlushModeType.AUTOFlushMode.AUTO

将 JPA 解包到休眠状态

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

@PersistenceUnit
private EntityManagerFactory entityManagerFactory;

您可以使用以下方法轻松访问底层:Sessionfactoryunwrap

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

JPA也可以这样做。如果通过注释注入:EntityManagerEntityManager@PersistenceContext

@PersistenceContext
private EntityManager entityManager;

您可以使用以下方法轻松访问底层:Sessionunwrap

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

结论

因此,您应该通过 JPA 进行引导,使用 and ,并且仅当您想要访问 JPA 中不可用的一些特定于 Hibernate 的方法(例如通过其自然标识符获取实体)时,才将这些内容解包到其关联的 Hibernate 接口。EntityManagerFactoryEntityManager


推荐