Hibernate PostgreSQL上的GenerationType.IDENTITY开销

Hibernate PostgreSQL上的GenerationType.IDENTITY开销,hibernate,postgresql,jpa,Hibernate,Postgresql,Jpa,本文件: 虽然身份排序似乎是分配id的最简单方法,但它们有几个问题。一种是,由于在插入行之前数据库不会分配id,因此在提交或刷新调用之后才能在对象中获取id。身份排序也不允许序列预分配,因此可能需要为插入的每个对象进行选择,,这可能会导致严重的性能问题,因此通常不建议这样做 Hibernate不鼓励GenerationType.IDENTITY Simple repository.save(通过Spring Data JPA)为我提供了以下SQL: Hibernate: select nextv

本文件:

虽然身份排序似乎是分配id的最简单方法,但它们有几个问题。一种是,由于在插入行之前数据库不会分配id,因此在提交或刷新调用之后才能在对象中获取id。身份排序也不允许序列预分配,因此可能需要为插入的每个对象进行选择,,这可能会导致严重的性能问题,因此通常不建议这样做

Hibernate不鼓励GenerationType.IDENTITY

Simple repository.save(通过Spring Data JPA)为我提供了以下SQL:

Hibernate: select nextval ('credits_id_sequence')
Hibernate: insert into fullname_credits (id) values (?)
Hibernate: insert into author (first_name, last_name, patronymic_name) values (?, ?, ?)
Hibernate: insert into string_credits (credits, id) values (?, ?)
Hibernate: insert into document (basic_credits_id, main_title, edition_credits_id, edition_description, imprint_place, publication_date, publisherName) values (?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into journal_article (endpage, designated_number, issn, series_main_title, startpage, id) values (?, ?, ?, ?, ?, ?)
Hibernate:更新作者集全名\u学分\u id=?其中id=

SQL日志记录是通过Spring的HibernateJavaEndorapter.showSql启用的。使用GenerationType.IDENTITY,除非出现
credits\u id\u sequence


因此,似乎没有用于id检索的select+insert,因此:Hibernate如何确定实体id?

您链接到的Hibernate文档一章中的第一个要点是:“如果Hibernate认为JDBC环境支持java.sql.Statement#getGeneratedKeys,那么该方法将用于提取标识生成的密钥。”@jb Nize确实如此,但没有关于幕后活动的信息。据我所知,它依赖于数据源(驱动程序、池)即使在这个特定的设置(hibernate+postgres)中,对吗?在后台,它调用Statement.getGeneratedKeys()Hibernate不会在自己的文档中重新解释所有这些。是的,它依赖于PostgreSQL JDBC驱动程序对该功能的支持。