当前位置: 首页 > 知识库问答 >
问题:

使用Hibernate会话工厂或JPA entityManager?

马博学
2023-03-14

我正在从事一个使用Hibernate4.1、Spring3.1和JPA2.0的项目,我想验证我从互联网上收集到的信息是否正确。

我正在尝试决定是使用JPA entityManager还是特定于hibernate的sessionFactory。

起初,我计划使用entityManager和完整的JPA规范,因此我的项目将与Hibernate脱钩,如果这种想法吸引了我,或者后来有什么东西说服了我,我可以把它换成其他东西,比如EclipseLink。

然而,entityManager似乎有一些非常重要的限制。

我的问题是:

我想使用完整的JPA规范和entityManager的唯一原因是能够相对容易地将Hibernate切换到不同的JPA 2.0兼容ORM,对吗?使用entityManager真的没有性能/功能/易于编程的好处吗?

其次,hibernate sessionFactory似乎比entityManager有很多好处。到目前为止,我遇到了entityManager不能批量插入实体列表的问题,我已经读过sessionFactory可以这样做。我还了解到sessionFactory可以自动返回自动生成的实体ID,而使用entityManager,您需要结束事务/刷新持久性上下文以提取新生成的ID。

我喜欢我的项目与Hibernate相对解耦的想法,但我更希望能够从一开始就编写高效的数据库更新。所以我应该切换到配置hibernate和sessionFactory的项目,对吗?

共有2个答案

鞠嘉誉
2023-03-14

JPA是Hibernate上的一个接口,Hibernate是jdbc上的一个接口,因此您离jdbc越近,您对查询的控制就越多,但您离对象/关系持久性越远。是的,Hibernate可能有一些jpa目前不提供的工具(即Hibernate spatial)。Hibernate很有趣,可以使用jpa注释来映射域模型(如果您使用.hbm文件的注释)。而且@Transactional注释在Spring中的工作方式与您使用hibernate还是jpa无关,因为您不需要会话。open()。。。一场开始散播。。。一场关等所有这些冗长的Hibernate代码都消失了!还有很多关于Hibernate和greate的文档。至于JPA,我不能说我找到了号码簿。。。

易琨
2023-03-14

我将坚持使用JPA2,就像您将使用List而不是ArrayList:您更喜欢接口(或抽象)而不是实现。除了HQL知道比JPQL或异国情调“更多”的东西之外,没有太大区别。还要记住,JPA是在Hibernate之后制作的,Hibernate是JPA背后的“灵感”。

对于奇异特性:Hibernate实体管理器包装Hibernate会话。如果确实需要,可以将EntityManager强制转换到Hibernate界面(org.Hibernate.jpa.HibernateEntityManager),并使用该会话。但如果我说我试过,那就是在骗你。

我还评论了你的部分问题:

我想使用完整的JPA规范和entityManager的唯一原因是能够相对容易地将Hibernate切换到不同的JPA 2.0兼容ORM,对吗?使用entityManager真的没有性能/功能/易于编程的好处吗?

从Hibernate切换到Eclipse Link并不意味着你“只需要交换罐子”。映射和注释解析是不一样的,您会遇到可能会阻止您切换的问题。

您可以在这里阅读我的问题,了解我在使用这两种方法时遇到的一个问题示例(这是一个maven项目,其概要文件是将JPA2.1 impl从EclipseLink切换到Hibernate)。我放弃了EclipseLink,因为我不能像我想要的那样命名数据库对象(或者更确切地说,指定数据库对象的名称)。

其次,hibernate sessionFactory似乎比entityManager有很多好处。到目前为止,我遇到了entityManager不能批量插入实体列表的问题,我已经读过sessionFactory可以这样做。我还了解到sessionFactory可以自动返回自动生成的实体ID,而使用entityManager,您需要结束事务/刷新持久性上下文以提取新生成的ID。

这取决于如何生成实体id。但是想想看:你的实体不会持久化,直到持久化上下文需要持久化它。这就是你没有身份证的原因。刷新它,也就是发送带有生成标识的插入查询,是唯一的方法。

这同样适用于会话工厂。

但是,您可能可以从Hibernate访问序列生成器,但也可以使用EntityManager在本机SQL中访问序列生成器。

我喜欢我的项目与Hibernate相对解耦的想法,但我更希望能够从一开始就编写高效的数据库更新。所以我应该切换到配置hibernate和sessionFactory的项目,对吗?

您可以将其视为针对ORM的巨魔,但为了高效地更新数据库,请使用普通JDBC(或SpringJDBC模板)。至少您知道数据何时更新,并且能够更好地优化(批量更新等)。

 类似资料:
  • 1. 前言 Hibernate 的核心价值观是:开发者们!做你们应该做的。脏的、累的、没技术含义的由本尊来做。 本节课和大家一起好好的聊聊 Hibernate 的核心组件之一:会话工厂(SessionFactory)。 通过本节课,你将学习到: 会话工厂的设计要求; 会话工厂的核心功能。 2. 会话工厂的作用 原生 Jdbc 开发如同自己炒菜做饭,需经手买菜、洗菜、做菜……一系列过程。 基于 Hi

  • 我的Hibernate查询SessionFactory sessionFactory=new Configuration(). confiure(). buildSessionFactory(); sess=sessionFactory.openSession()有问题;我在每个函数中都调用它,我如何避免它只创建一次sessionFactory

  • 我正在尝试在eclipse中设置Hibernate Tools。问题是它找不到任何映射文件。 我创建了一个控制台配置,指向我的environment.properties文件和hibernate.cfg.xml.问题是hibernate.cfg.xml.中没有映射 看起来它在myproject持久化中使用了spring bean sessionFactory。xml(如下)来查找所需的映射文件。我

  • 我尝试使用HikariCP池连接,但我无法启动应用程序,因为我一直在创建sesion中获取空对象。 这是我的配置: 系统 Hibernate4.3.6。最终 MariaDB v10.0(x64) HibernateUtil类 hibernate.cfg.xml 日志 正在准备使用过滤器构建会话工厂:{}hh000130:实例化显式连接提供程序:org.mariadb.jdbc。应用程序启动方法中的

  • 我正在将Hibernate拦截器与(Hibernate 4.x)一起使用。我想对会话的save方法执行一些操作。所以我扩展了EmptyInterceptor。 它有以下几种方法: 问题:在postFlush()我想执行保存操作。所以我的控制卡在循环中。因为每当session.save()被调用我的调用时,空拦截器的onSave()和postFlush()方法被调用来拦截SAVE操作。 为了消除这个

  • 问题内容: 有谁知道如何获取由Spring Boot创建的Hibernate SessionFactory的句柄? 问题答案: 您可以使用以下方法完成此操作: 其中,entityManagerFactory是一个JPA 。