Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Hibernate偶尔会执行select CURVAL?_Hibernate_Jpa_Jdbc Postgres - Fatal编程技术网

为什么Hibernate偶尔会执行select CURVAL?

为什么Hibernate偶尔会执行select CURVAL?,hibernate,jpa,jdbc-postgres,Hibernate,Jpa,Jdbc Postgres,有时,Hibernate会在持久化操作期间执行这样的查询: 选择currval('MY_TABLE_NAME_id_seq'); 实体: @实体 @表(name=“MY\u Table\u name”) 公共类MyEntity{ @身份证 @列(name=“ID”,unique=true,nullable=false) @GeneratedValue(策略=GenerationType.IDENTITY) 私人长id; } 代码: @Transactional 公共void persistM

有时,Hibernate会在持久化操作期间执行这样的查询:

选择currval('MY_TABLE_NAME_id_seq');
实体:

@实体
@表(name=“MY\u Table\u name”)
公共类MyEntity{
@身份证
@列(name=“ID”,unique=true,nullable=false)
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
}
代码:

@Transactional
公共void persistMyEntity(字符串名称){
MyEntity实体=新的MyEntity(名称);
sessionFactory.getCurrentSession().persist(实体);
}
生成的sql:

将名称(NAME)值('xyz')插入MY_表中;
选择currval('MY_TABLE_NAME_id_seq');
但通常不会执行
select currval
。有什么解释吗

顺便说一句,我的问题非常类似于,但问题中的解决方案并不适合我

注:

我的表名称ddl sql:

CREATE TABLE my\u TABLE\u name(
id bigserial不为空,
名称字符变化(256)不为空,
约束我的\u表\u名称\u id主键(id)
);
休眠属性:

Properties hibernateProperties=新属性();
hibernateProperties.put(“hibernate.dial”,hibernate_方言);
hibernate属性.put(“hibernate.show\u sql”,hibernate\u show\u sql);
hibernateProperties.put(“hibernate.hbm2ddl.auto”,“none”);
hibernateProperties.put(“hibernate.connection.release_mode”、“auto”);
hibernateProperties.put(“hibernate.archive.autodetection”,archive\u autodetection);
hibernate.properties.put(“hibernate.format_sql”,true);
hibernate.properties.put(“hibernate.use\u sql\u comments”,true);
hibernate.properties.put(“hibernate.generate_statistics”,false);
hibernateProperties.put(“hibernate.jdbc.use_scrollable_resultset”,true);
hibernateProperties.put(“hibernate.jdbc.use\u streams\u for\u binary”,true);
hibernate.properties.put(“hibernate.jdbc.batch_size”,20);
hibernate.properties.put(“hibernate.order_inserts”,true);
hibernate.properties.put(“hibernate.order\u updates”,true);
hibernateProperties.put(“hibernate.jdbc.batch\u versioned\u data”,true);
hibernate.properties.put(“hibernate.cache.region_前缀”,“hibernate.cache”);
hibernateProperties.put(“hibernate.cache.use\u query\u cache”,false);
hibernateProperties.put(“hibernate.cache.use_second_level_cache”,false);
setHibernateProperties(hibernateProperties);
  • PostgreSQL版本:11.5
  • hibernate.dialogue:org.hibernate.dialogue.postgresql9dialogue
  • Hibernate版本:5.4.5.Final
  • PostgreSQL JDBC驱动程序:PostgreSQL-9.4

    • 根据冬眠:

      2.6.10。使用标识列

      为了实现基于标识列的标识符值生成,Hibernate使用其
      org.Hibernate.id.IdentityGenerator
      id生成器,该生成器期望通过插入到表中来生成标识符。IdentityGenerator了解检索插入生成值的3种不同方式:

    • 如果Hibernate认为JDBC环境支持
      java.sql.Statement#getGeneratedKeys
      ,那么该方法将用于提取标识生成的密钥
    • 否则,如果
      方言#supportsInsertSelectIdentity
      报告为true,Hibernate将使用方言特定的INSERT+SELECT语句语法
    • 否则,Hibernate将期望数据库支持某种形式的请求,即通过一个单独的SQL命令请求最近插入的标识值,如
      dialante#getIdentitySelectString
    • 您可以通过以下方式显式指定
      java.sql.Statement#getGeneratedKeys

      true
      

      您没有这样做,因此,hibernate以某种方式将其值视为
      false
      。然后hibernate检查方言.getIdentityColumnSupport().supportsInsertSelectIdentity()的值。。您的案例为
      false
      。最后一条路就是冬眠。请参见该类的实现。getIdentitySelectString方法生成的sql与您投诉的sql完全相同。

      能否提供
      hibernate.cfg.xml
      设置?您使用的是什么hibernate版本?@SternK我补充道。请同时显示您的表
      MY_table\u NAME
      ddl sql。您使用什么版本的PostgreSQL JDBC驱动程序?您对hibernate.hbm2ddl.auto属性使用什么值?@SternK我还添加了您需要的其他信息。谢谢您的回答。但据我从hibernate文档
      hibernate.jdbc.中了解,默认情况下,use\u get\u generated\u keys
      true
      。我还观察到,hibernate通常在不生成
      selectcurrval
      sql的情况下获取id。但是raerly
      select currval
      sql被生成。那么,我们可以说这是JDBC驱动程序或Hibernate的一种缺陷吗?这是一个已知的问题吗?为什么会发生这种情况?你知道吗?我在hibernate文档中没有看到默认情况下,
      hibernate.jdbc.use\u get\u generated\u keys
      true
      。我看到,
      默认情况下,它尝试从连接元数据检测驱动程序功能。
      。我试图通过使用您的jdbc驱动程序版本重现您的问题,但没有成功。也许它与您的应用程序运行的环境有关。