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

You*_*sef 21 java spring hibernate jpa transactions

Hibernate文档说:

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

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

@Id
@GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY)
private Integer id;
Run Code Online (Sandbox Code Playgroud)

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

  1. 有什么问题IDENTITY
  2. 是否禁用批量插入?
  3. 我怎么解决这个问题?

Vla*_*cea 30

  1. Hibernate试图将持久性上下文推迟到最后一刻.这种策略传统上称为事务性后写.

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

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

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

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

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

  3. 唯一的解决方案是使用TABLE标识符生成器,​​由pooled-lo优化器支持.这个生成器也适用于MySQL,因此它克服了数据库SEQUENCE支持的缺乏.但是,TABLE生成器的性能比IDENTITY差,所以最后,这不是一个可行的替代方案.因此,使用IDENTITY仍然是MySQL的最佳选择,如果你需要批量插入,你可以使用jOOQ.Hibernate和jOOQ是一个很棒的组合.

  • 仅批处理 INSERT 受到影响。使用 IDENTITY 可以很好地对 UPDATE 和 DELETE 语句进行批处理。 (2认同)