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

Posted 木心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 在项目中的使用小结

以上是关于PostGreSQL 结合 Hibernate 在项目中的使用小结的主要内容,如果未能解决你的问题,请参考以下文章

Play + JPA + Hibernate + PostgreSQL:无法创建表

Hibernate 3:无法查询 PostgreSQL 数据库

long 类型的错误值:- Postgresql、Hibernate、Spring

Docker/Hibernate/PostgreSQL - 将运行 Hibernate/SpringBoot 应用程序的容器与 postgreSQL 容器不工作连接

将 PostgreSQL 9.2.1 与 Hibernate 连接起来

不能用Hibernate调用PostgreSQL的11个存储过程