当前位置: 首页 > 面试题库 >

使用身份标识符生成器时,Hibernate禁用了插入批处理

黎苑博
2023-03-14
问题内容

Hibernate文档说:

如果使用身份标识符生成器,​​则Hibernate透明地在JDBC级别禁用插入批处理。

但是我所有的实体都具有以下配置:

@Id
@GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY)
private Integer id;

当我在上方使用此身份时

  1. 有什么问题IDENTITY吗?
  2. 批量插入被禁用了吗?
  3. 我该如何解决?

问题答案:
  1. Hibernate尝试将持久性上下文刷新推迟到最后可能的时刻。传统上,这种策略被称为事务后写。

后写与Hibernate刷新更相关,而不是任何逻辑或物理事务。在事务期间,刷新可能会发生多次。

仅对当前数据库事务可见刷新的更改。在提交当前事务之前,其他并发事务看不到任何更改。

  1. 所述IDENTITY发生器允许的整数/ BIGINT列是自动递增上的需求。增量过程发生在当前正在运行的事务之外,因此回滚最终可能会丢弃已分配的值(可能会发生值差距)。

增量过程非常有效,因为它使用了数据库内部的轻量级锁定机制,而不是重量级的事务性过程粒度锁定。

唯一的缺点是我们无法在执行INSERT语句之前知道新分配的值。这种限制阻碍了Hibernate采用的“事务后写”刷新策略。因此,Hibernates使用IDENTITY生成器禁用对实体的JDBC批处理支持。

  1. 唯一的解决方案是使用TABLE标识符生成器,​​该生成器由pooled-lo优化器支持。该生成器也可与MySQL一起使用,因此它克服了对数据库SEQUENCE支持的不足。但是,TABLE生成器的性能要比IDENTITY差,因此最后,这不是可行的选择。因此,在MySQL上,使用IDENTITY仍然是最佳选择,如果需要批量插入,则可以使用jOOQ。Hibernate和jOOQ是很好的组合。


 类似资料:
  • 问题内容: 我有以下映射 SACP表根据 当我尝试保存Sacp实例时,Hibernate抱怨 ORA-01438:此列允许的值大于指定的精度 即使使用Long而不是Integer,也会引发相同的错误 我该怎么解决? 问题答案: 我发现了这个 SEQ_GEN使用名为my_sequence的序列定义序列生成器。此基于序列的hilo算法使用的分配大小为20。请注意,此版本的Hibernate Annot

  • 我有一个实体,除了主键之外,还应该为它生成一个额外的唯一标识符: 属性值通过调用 并添加前缀字符串,从 postgres 序列值派生而来。当我执行大容量插入时,我必须求助于在我的JPA存储库中为实体定义的自定义查询,该查询一次检索多个序列值,但我想使此过程自动进行。 我尝试实现< code>IdentifierGenerator接口,但我能实现的最好结果是为每个插入的新实体执行一个< code>S

  • 我很难让Hibernate在MySQL上执行大容量插入。 我有要排序的主键生成类型,下面是我的dao.xml 这使得每次都可以执行单个查询。我也相应地刷新和清除实体管理器。 技术堆栈:Spring 4,Hibernate 5.2。 编辑1:我也浏览了下面的链接,但没有运气 https://vladmihalcea.com/how-to-batch-insert-and-update-stateme

  • 问题内容: 我正在将spring,h2和liquibase与hibernate一起使用,并且试图通过以本博客文章为例为我的实体创建自定义String id生成器,但出现错误: 这是我的SequenceStyleGenerator代码: 我的实体代码: 和liquibase XML: 顺便说一句,有可能避免参数sequence_name,以便hibernate可以自行处理吗? 如果有人可以帮助我,谢

  • 我想对我的Vue使用Firebase身份验证。js应用程序考虑以下限制: 我无法使用任何受支持的提供商(Facebook、Google等) 我不能使用电子邮件-该应用程序是为孩子们设计的,因此,我想使用他们在注册时选择的唯一昵称,而不是电子邮件,该昵称必须使用本地rtl语言(非英语) 我想使用firebase云函数作为唯一的服务器端代码 期望的结果是:a)使用昵称、密码注册 如何使用firebas

  • 问题内容: 对于使用不区分大小写的数据库模式的JPA实体模型,当我使用@IdClass批注时,始终会出现“实例标识符已更改”异常。对于具有“字符串”主键的对象,当数据库中存在一种情况的字符串并且使用相同的字符串(仅大小写不同)执行查询时,将发生错误。 我看过其他的SO答案,它们的形式是:a)不要修改主键(我不是),b)equals()/ hashCode()实现有缺陷。对于’b’,我尝试使用和,但