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.0(PostgreSQL 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(); }
posted on 2020-06-20 09:45 wenbin_ouyang 阅读(1381) 评论(0) 编辑 收藏 举报