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

时间:2014-12-30 00:04:04

标签: java spring hibernate jpa transactions

Hibernate文档说:

  

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

但是我的所有实体都有这样的配置:

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

当我在上面使用这个身份时

  1. IDENTITY的问题是什么?
  2. 是否禁用批量插入?
  3. 我该如何解决这个问题?

1 个答案:

答案 0 :(得分:24)

  1. Hibernate尝试将持久性上下文推迟到最后一刻。此策略传统上称为transactional write-behind

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

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

  2. IDENTITY generator允许整数/ bigint列按需自动递增。增量过程发生在当前运行的事务之外,因此回滚可能最终丢弃已分配的值(可能发生值差异)。

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

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

  3. 唯一的解决方案是使用由pooled-lo optimizer支持的TABLE标识符生成器。这个生成器也适用于MySQL,因此它克服了数据库SEQUENCE支持的缺乏。但是,the TABLE generator performs worse than IDENTITY,所以最后,这不是一个可行的选择。因此,使用IDENTITY仍然是MySQL的最佳选择,如果您需要批量插入,you can use jOOQ for that。 Hibernate和jOOQ是一个很棒的组合。