使用GenerationType.IDENTITY和GenerationType.SEQUENCE时,数据何时持久保存到数据库?

时间:2018-08-10 04:12:58

标签: jpa

上下文:Java EE应用程序应尽可能减少数据丢失的风险。目前,这可能是以性能为代价的,因为服务器的负载不是很高。

我的理解是,在实例化对象时,GenerationType.IDENTITY向数据库执行立即插入操作,而GenerationType.SEQUENCE对数据库执行读取操作以检索数据库序列的下一个值。用于此信息的来源来自VS 2017。如果我的理解错误,请纠正我。

根据我的理解,在这种情况下,GenerationType.IDENTITY应该比GenerationType.SEQUENCE优先,因为数据会更早地保存到数据库中?

1 个答案:

答案 0 :(得分:1)

Hibernate立即为标记为GenerationType.IDENTITY的实体保留数据,因为Hibernate需要知道主键值来维护会话。但这有缺陷,因为这种生成类型将无法使用许多Hibernate优化技术。

对于标记有GenerationType.SEQUENCE的实体,当使用session.save()或session.persist()持久存储对象时,Hibernate在内部触发选择查询并填充主键。然后,当会话被“刷新” /“提交”时,它可以保存数据。 此外,由于该实体是用主键填充的,所以Hibernate可以在内部对这些实体使用优化技术,例如JDBC Batching和所有。

更多信息可在此处查看-https://www.thoughts-on-java.org/jpa-generate-primary-keys/