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就像SessionFactoryand 一样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 进行引导,使用EntityManagerFactoryand 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 EntityManagerAPI 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 次 |
| 最近记录: |