elp*_*isu 234 java hibernate jpa sessionfactory hibernate-entitymanager
我是Hibernate的新手,不知道是否要使用SessionFactory
或EntityManagerFactory
获取hibernate会话.两者有什么区别?优点缺点?
Boz*_*zho 351
喜欢EntityManagerFactory
和EntityManager
.它们由JPA标准定义.
SessionFactory
并且Session
是特定于休眠的.该EntityManager
调用引擎盖下Hibernate的Session.如果您需要一些不可用的特定功能EntityManager
,您可以通过调用以下方式获取会话:
Session session = entityManager.unwrap(Session.class);
Run Code Online (Sandbox Code Playgroud)
Vla*_*cea 45
SessionFactory
对比 EntityManagerFactory
正如我在Hibernate User Guide 中解释的那样,HibernateSessionFactory
扩展了 JPA EntityManagerFactory
,如下图所示:
所以,这SessionFactory
也是一个 JPA EntityManagerFactory
。
theSessionFactory
和 theEntityManagerFactory
都包含实体映射元数据,并允许您创建 HibernateSession
或EntityManager
.
Session
对比 EntityManager
就像SessionFactory
and 一样EntityManagerFactory
,HibernateSession
扩展了 JPA EntityManager
。因此,由 定义的所有方法EntityManager
都可以在 Hibernate 中使用Session
。
在Session
和`EntityManager的翻译实体状态转换成SQL语句,如SELECT,INSERT,UPDATE和DELETE。
在引导 JPA 或 Hibernate 应用程序时,您有两种选择:
SessionFactory
通过BootstrapServiceRegistryBuilder
. 如果您使用的是 Spring,则 Hibernate 引导程序是通过 完成的LocalSessionFactoryBean
,如这个 GitHub 示例 所示。EntityManagerFactory
通过Persistence
类或EntityManagerFactoryBuilder
. 如果您使用的是 Spring,则 JPA 引导程序是通过 完成的LocalContainerEntityManagerFactoryBean
,如这个 GitHub 示例 所示。通过 JPA 引导是首选。这是因为 JPAFlushModeType.AUTO
是比 legacy 更好的选择FlushMode.AUTO
,它破坏了本机 SQL 查询的 read-your-writes 一致性。
此外,如果您通过 JPA 引导,并且您已经EntityManagerFactory
通过@PersistenceUnit
注释注入了:
@PersistenceUnit
private EntityManagerFactory entityManagerFactory;
Run Code Online (Sandbox Code Playgroud)
您可以Sessionfactory
使用以下unwrap
方法轻松访问底层:
SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
Run Code Online (Sandbox Code Playgroud)
对 JPA 也可以这样做EntityManager
。如果您EntityManager
通过@PersistenceContext
注释注入:
@PersistenceContext
private EntityManager entityManager;
Run Code Online (Sandbox Code Playgroud)
您可以Session
使用以下unwrap
方法轻松访问底层:
Session session = entityManager.unwrap(Session.class);
Run Code Online (Sandbox Code Playgroud)
因此,您应该通过 JPA 进行引导,使用EntityManagerFactory
and EntityManager
,并且仅在您想要访问 JPA 中不可用的某些特定于 Hibernate 的方法时才将它们解包到其关联的 Hibernate 接口,例如通过其获取实体自然标识符。
toy*_*toy 30
我想补充一点,你也可以通过调用getDelegate()
方法来获取Hibernate的会话EntityManager
.
例如:
Session session = (Session) entityManager.getDelegate();
Run Code Online (Sandbox Code Playgroud)
Bas*_*igt 19
我更喜欢JPA2 EntityManager
API SessionFactory
,因为它感觉更现代.一个简单的例子:
JPA:
@PersistenceContext
EntityManager entityManager;
public List<MyEntity> findSomeApples() {
return entityManager
.createQuery("from MyEntity where apples=7", MyEntity.class)
.getResultList();
}
Run Code Online (Sandbox Code Playgroud)
SessionFactory的:
@Autowired
SessionFactory sessionFactory;
public List<MyEntity> findSomeApples() {
Session session = sessionFactory.getCurrentSession();
List<?> result = session.createQuery("from MyEntity where apples=7")
.list();
@SuppressWarnings("unchecked")
List<MyEntity> resultCasted = (List<MyEntity>) result;
return resultCasted;
}
Run Code Online (Sandbox Code Playgroud)
我认为很明显第一个看起来更干净,也更容易测试,因为EntityManager很容易被嘲笑.
归档时间: |
|
查看次数: |
119379 次 |
最近记录: |