• PostGreSQL 结合 Hibernate 在项目中的使用小结


    1、主键生成策略设置为 identity

      主键生成策略设置为 native时

      打印 sql:

    09:24:52.551 INFO  (TaskFacadeImpl.java              :43) : TaskFacadeImpl#add
    Hibernate:
        select
            nextval ('hibernate_sequence')

      

      改为 identity

    09:34:04.933 INFO  (TaskFacadeImpl.java              :43) : TaskFacadeImpl#add
    Hibernate:
        insert
        into
            dm.dm_task
            (task_name, task_height, data, last_update_time, task_desc)
        values
            (?, ?, ?, ?, ?)

      注意: 插入记录需要手动开启事务和提交事务(最好不要设置自动提交事务)

    2、ERROR: The RETURNING clause of the INSERT statement is not supported in this version of Greenplum Database

      使用 postgresql-12.1-1  + hibernate 插入记录时没有问题。

      改为使用 greenplum。gpstate 指令查看版本 Greenplum Database 5.19.0PostgreSQL 8.3.23)

    master Greenplum Version: 'PostgreSQL 8.3.23 (Greenplum Database 5.19.0 build commit:7f5d6a22614522e47fa1020933e0a231a122b00a) on x86_64-pc-linux-gnu, compiled by GCC gcc (GCC) 6.2.0, 64-bit compiled on May 15 2019 16:16:39'

      

      Greenplum Database 5.19.0 + hibernate 报错,日志:

    Hibernate:
        insert
        into
            dm.dm_task
            (task_name, task_height, data, last_update_time, task_desc)
        values
            (?, ?, ?, ?, ?)
    09:24:58.793 WARN  (SqlExceptionHelper.java          :137) : SQL Error: 0, SQLState: 0A000
    09:24:58.794 ERROR (SqlExceptionHelper.java          :142) : ERROR: The RETURNING clause of the INSERT statement is not supported in this version of Greenplum Database.

       因为 插入操作使用的使用 hibernate 的 save() 方法,默认 添加了 returning 子句获取生成的主键。PostgreSQL 8.3.23 不支持。

      mybaties 插入操作默认返回影响的记录数,同样会出现 returning clause 不支持的问题,见 Greenplum+mybatis问题解析

    /**
     * Persist the given transient instance, first assigning a generated identifier. (Or
     * using the current value of the identifier property if the <tt>assigned</tt>
     * generator is used.)  This operation cascades to associated instances if the
     * association is mapped with {@code cascade="save-update"}
     *
     * @param entityName The entity name
     * @param object a transient instance of a persistent class
     *
     * @return the generated identifier
     */
    Serializable save(String entityName, Object object);

      解决:使用 hibernate 执行原生 sql

    public void add(Task task) {
        Session session = getSession();
        // greenplum5.19.0 不支持save()的returning子句,
        // 调用 save() 方法报错 ERROR: The RETURNING clause of the INSERT statement is not supported in this version of Greenplum Database.
        // session.save(task);
    
        String sqlTemp = "insert into dm.dm_task(task_name, task_height, data, last_update_time, task_desc) values (''{0}'', {1}, ''{2}'', ''{3}'', ''{4}'')";
        String sql = MessageFormat.format(sqlTemp, task.getTaskName(), task.getTaskHeight(), task.getData(), task.getLastUpdateTime(), task.getTaskDesc());
        session.createSQLQuery(sql).executeUpdate();
    }

     另外参考:PostGreSQL 结合 Hibernate 在项目中的使用小结

  • 相关阅读:
    免费的Office批量打印工具 Word、Excel、PDF批量打印
    PHP数据库批量去注释、删字段
    SSL/TLS协议信息泄露漏洞(CVE-2016-2183)【原理扫描】
    CentOS 安装 nginx-1.19.4 与原版本共存
    毕业5年之——上个五年计划复盘20210919
    ubunt 20.04 有道词典命令行工具
    java中针对 try,catch和finally一些总结
    Linux find命令与cp命令连用
    MySQL基本操作笔记
    挖矿病毒排查
  • 原文地址:https://www.cnblogs.com/xy-ouyang/p/13167638.html
Copyright © 2020-2023  润新知