Hibernate SessionFactory vs. JPA EntityManagerFactory
我是Hibernate的新手,我不确定是使用Hibernate还是JPA来创建Hibernate。SessionFactory
EntityManagerFactory
Session
这两者之间有什么区别?使用它们中的每一个的利弊是什么?
我是Hibernate的新手,我不确定是使用Hibernate还是JPA来创建Hibernate。SessionFactory
EntityManagerFactory
Session
这两者之间有什么区别?使用它们中的每一个的利弊是什么?
首选和 。它们由 JPA 标准定义。EntityManagerFactory
EntityManager
SessionFactory
并且是特定于休眠的。调用后台的休眠会话。如果您需要一些在 中不可用的特定功能,则可以通过调用以下命令来获取会话:Session
EntityManager
EntityManager
Session session = entityManager.unwrap(Session.class);
SessionFactory
断续器EntityManagerFactory
正如我在休眠用户指南中所解释的那样,休眠扩展了 JPA,如下图所示:SessionFactory
EntityManagerFactory
因此,这也是一个JPA。SessionFactory
EntityManagerFactory
和 都包含实体映射元数据,并允许您创建休眠或 .SessionFactory
EntityManagerFactory
Session
EntityManager
Session
断续器EntityManager
就像 and 一样,休眠扩展了 JPA。因此,由 定义的所有方法都可以在 休眠 中使用。SessionFactory
EntityManagerFactory
Session
EntityManager
EntityManager
Session
和 'EntityManager 将实体状态转换转换为 SQL 语句,如 SELECT、INSERT、UPDATE 和 DELETE。Session
引导 JPA 或休眠应用程序时,您有两种选择:
BootstrapServiceRegistryBuilder
创建一个。如果您使用的是Spring,则Hibernate引导是通过,如GitHub示例所示。SessionFactory
LocalSessionFactoryBean
Persistence
类或 EntityManagerFactoryBuilder
创建 JPA。如果您使用的是 Spring,则 JPA 引导是通过 完成,如 GitHub 示例所示。EntityManagerFactory
LocalContainerEntityManagerFactoryBean
通过 JPA 进行自举是首选。这是因为JPA是一个比传统更好的选择,它打破了本机SQL查询的读写一致性。FlushModeType.AUTO
FlushMode.AUTO
另外,如果您通过 JPA 引导,并且已通过注释注入了:EntityManagerFactory
@PersistenceUnit
@PersistenceUnit
private EntityManagerFactory entityManagerFactory;
您可以使用以下方法轻松访问底层:Sessionfactory
unwrap
SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
JPA也可以这样做。如果通过注释注入:EntityManager
EntityManager
@PersistenceContext
@PersistenceContext
private EntityManager entityManager;
您可以使用以下方法轻松访问底层:Session
unwrap
Session session = entityManager.unwrap(Session.class);
因此,您应该通过 JPA 进行引导,使用 and ,并且仅当您想要访问 JPA 中不可用的一些特定于 Hibernate 的方法(例如通过其自然标识符获取实体)时,才将这些内容解包到其关联的 Hibernate 接口。EntityManagerFactory
EntityManager