首页 > 解决方案 > PostgreSQL 9.6 分区表和 grails 2.5.6 在 tomcat7 或 tomcat8 下的怪异操作

问题描述

我的项目中有这样的配置: - grails 2.5.6 和 hibernate4 (4.3.8.1) - 带有分区表的 PostgreSQL 9.6(我们使用 pg_partman 扩展来进行分区) - 部署在 tomcat 7 中

我们正在考虑将 tomcat7 升级到 tomcat8 或 tomcat8.5。现在问题来了,tomcat7 一切正常。但是将相同的战争部署到 tomcat8 时,当我们尝试在分区表中保存记录时会出现此错误:

2018-09-06 17:33:14,976 [lecturaQueueMessageJmsListenerContainer-1] ERROR The database returned no natively generated identity value; nested exception is org.hibernate.HibernateException: The database returned no natively generated identity value
2018-09-06 17:33:14,977 [lecturaQueueMessageJmsListenerContainer-1] ERROR hibernate.AssertionFailure  - HHH000099: an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session): org.hibernate.AssertionFailure: null id in xxx.Lectura entry (don't flush the Session after an exception occurs)
2018-09-06 17:33:15,125 [lecturaQueueMessageJmsListenerContainer-1] ERROR Lectura$$EnhancerBySpringCGLIB$$c61146fe.queueMessage  - Exception raised in message listener
org.springframework.jms.listener.adapter.ListenerExecutionFailedException: Listener method 'queueMessage' threw exception; nested exception is org.hibernate.AssertionFailure: null id in xx.Lectura entry (don't flush the Session after an exception occurs)
    at grails.plugin.jms.listener.adapter.PersistenceContextAwareListenerAdapter.invokeListenerMethod(PersistenceContextAwareListenerAdapter.groovy:45)
    at grails.plugin.jms.listener.adapter.LoggingListenerAdapter.onMessage(LoggingListenerAdapter.groovy:49)
    at grails.plugin.jms.listener.adapter.PersistenceContextAwareListenerAdapter.onMessage(PersistenceContextAwareListenerAdapter.groovy:33)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.hibernate.AssertionFailure: null id in xx.Lectura entry (don't flush the Session after an exception occurs)
    ... 4 more 

我猜这个问题与休眠有关。是否有意义?有谁知道为什么我在 tomcat8 上得到这个错误而在 tomcat7 上没有得到它?

读到这个,我看到很多人都在谈论得到空 id 错误,但它在 tomcat7 和 tomcat8 上都不起作用。这就是为什么我不明白为什么在我的情况下在 tomcat7 上工作正常,但在 tomcat8 或 tomcat8.5 上不工作。

PS。只是为了增加更多的混乱,如果我在 tomcat8 上部署战争但在 windows 下它可以正常工作。但是如果我将它部署在linux(官方docker alpine tomcat 8容器)下,它会在保存记录时通过null id的错误。

标签: postgresqlhibernategrailstomcat7tomcat8

解决方案


看来您的数据库正在返回一条 id 为 null 的记录。您是否尝试过执行原始 sql 查询并检查返回的内容?你可以尝试这样做:

// Get sessionFactory injecting in a service or from ApplicationContext
final session = sessionFactory.currentSession
final String query = 'select * from my_table';
final queryResults = session.createSQLQuery(query).list();
// Inspect your result list

推荐阅读