休眠SessionFactory与EntityManagerFactory

如何解决休眠SessionFactory与EntityManagerFactory

| 我是Hibernate的新手,并且不清楚是使用ѭ0还是ѭ1来获取休眠会话。两者有什么区别?优点缺点?     

解决方法

优选
EntityManagerFactory
EntityManager
。它们由JPA标准定义。
SessionFactory
Session
是休眠专用的。
EntityManager
在后台调用休眠会话。并且,如果您需要某些ѭ3中没有的特定功能,则可以通过调用以下内容来获得会话:
Session session = entityManager.unwrap(Session.class);
    ,我想补充一点,您还可以通过从
EntityManager
调用
getDelegate()
方法来获得Hibernate的会话。 例如:
Session session = (Session) entityManager.getDelegate();
    ,使用EntityManagerFactory方法可以使我们无需额外配置即可使用@ PrePersist,@ PostPersist,@ PreUpdate等回调方法注释。 在使用SessionFactory时使用类似的回调将需要额外的精力。 相关的Hibernate文档可在此处和此处找到。 相关的SOF问题和Spring论坛讨论     ,我觉得JPA2
EntityManager
API比
SessionFactory
好,因为它感觉更现代。一个简单的例子: JPA:
@PersistenceContext
EntityManager entityManager;

public List<MyEntity> findSomeApples() {
  return entityManager
     .createQuery(\"from MyEntity where apples=7\",MyEntity.class)
     .getResultList();
}
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;
}
我认为很明显,第一个看起来更干净并且也更易于测试,因为EntityManager可以轻松模拟。     ,通过使用EntityManager,代码不再与休眠紧密结合。但是为此,在使用中我们应该使用:
javax.persistence.EntityManager
代替
org.hibernate.ejb.HibernateEntityManager
同样,对于EntityManagerFactory,请使用javax接口。这样,代码就可以松散耦合。如果有一个比休眠更好的JPA 2实现,则切换将很容易。在极端情况下,我们可以将强制类型转换为HibernateEntityManager。     ,EntityManager接口类似于休眠中的sessionFactory。 EntityManager在javax.persistance包下,而session和sessionFactory在org.hibernate.Session / sessionFactory包下。 实体管理器是JPA特定的,而session / sessionFactory是休眠的。     ,EntityManagerFactory是标准实现,在所有实现中都相同。如果您将ORM迁移到其他任何提供程序(例如EclipseLink),则处理事务的方法将没有任何变化。相反,如果使用休眠的会话工厂,则它将与休眠的API绑定在一起,并且无法迁移到新的供应商。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?