Jpa 使用GenerationType.IDENTITY与GenerationType.SEQUENCE时,数据何时持久化到数据库?
上下文:JavaEE应用程序应该尽可能降低数据丢失的风险。目前,这可能以性能为代价,因为服务器上的负载没有那么高 我的理解是,Jpa 使用GenerationType.IDENTITY与GenerationType.SEQUENCE时,数据何时持久化到数据库?,jpa,Jpa,上下文:JavaEE应用程序应该尽可能降低数据丢失的风险。目前,这可能以性能为代价,因为服务器上的负载没有那么高 我的理解是,GenerationType.IDENTITY在实例化对象时立即向数据库中插入操作,而GenerationType.SEQUENCE对数据库执行读取操作,以检索数据库序列的下一个值。用于此信息的源来自。如果我的理解有误,请纠正我 据我了解,,在这种情况下,是否应该优先选择GenerationType.IDENTITY而不是GenerationType.SEQUENCE,因
GenerationType.IDENTITY
在实例化对象时立即向数据库中插入操作,而GenerationType.SEQUENCE
对数据库执行读取操作,以检索数据库序列的下一个值。用于此信息的源来自。如果我的理解有误,请纠正我
据我了解,,在这种情况下,是否应该优先选择
GenerationType.IDENTITY
而不是GenerationType.SEQUENCE
,因为数据会更早地持久化到数据库?对于标记为GenerationType.IDENTITY的实体,Hibernate会立即持久化数据,因为Hibernate需要知道主键值来维护会话。但这也有缺陷,因为这一代人无法使用许多Hibernate优化技术
对于标记为GenerationType.SEQUENCE的实体,当使用session.save()或session.persist()持久化对象并填充主键时,Hibernate会在内部触发select查询。然后,它可以在刷新/提交会话时保存数据。
此外,由于实体中填充了主键,Hibernate可以在内部对这些实体使用优化技术,如JDBC批处理和所有
更多信息请参见此处-简短的回答是,这取决于数据库。例如,Mysql不支持序列,Oracle不支持自动增量列,因此序列是唯一的选择,我认为Postgress同时支持这两个选项,并且当使用自动增量时,序列会在引擎盖下使用。这也取决于JPA提供程序。同样,身份也意味着您不能利用batch InsertsHanks!Hibernate是JPA提供程序。我会选择AUTO,让Hibernate做出判断。谢谢!也查看了,其中有关于GenerationType.IDENTITY的其他警告。在这种情况下,它将保持自动,并让Hibernate做出判断。