Hibernate文档说:
如果,Hibernate会透明地禁用JDBC级别的插入批处理 您使用身份标识符生成器。
但是我的所有实体都有这样的配置:
@Id
@GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY)
private Integer id;
当我在上面使用这个身份时
IDENTITY
的问题是什么?答案 0 :(得分:24)
Hibernate尝试将持久性上下文推迟到最后一刻。此策略传统上称为transactional write-behind。
后写与Hibernate刷新更相关,而不是任何逻辑或物理事务。在交易期间,冲洗可能会多次发生。
刷新的更改仅对当前数据库事务可见。在提交当前事务之前,其他并发事务不会显示任何更改。
IDENTITY generator允许整数/ bigint列按需自动递增。增量过程发生在当前运行的事务之外,因此回滚可能最终丢弃已分配的值(可能发生值差异)。
增量过程非常有效,因为它使用数据库内部轻量级锁定机制,而不是更重量级的事务过程 - 粒度锁。
唯一的缺点是我们在执行INSERT语句之前无法知道新分配的值。这种限制阻碍了Hibernate采用的“事务性写入”冲洗策略。因此,Hibernates禁用使用IDENTITY生成器的实体的JDBC批处理支持。
唯一的解决方案是使用由pooled-lo optimizer支持的TABLE标识符生成器。这个生成器也适用于MySQL,因此它克服了数据库SEQUENCE支持的缺乏。但是,the TABLE generator performs worse than IDENTITY,所以最后,这不是一个可行的选择。因此,使用IDENTITY仍然是MySQL的最佳选择,如果您需要批量插入,you can use jOOQ for that。 Hibernate和jOOQ是一个很棒的组合。