postgresql - PostgreSQL 9.6分区表和gram 2.5.6 tomcat7或tomcat8下的怪异操作

标签 postgresql hibernate grails tomcat7 tomcat8

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

我们正在考虑将tomcat7升级到tomcat8或tomcat8.5。现在问题来了,tomcat7都可以正常工作。但是,将相同的 war 部署到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上收到此错误?

读到这一点,我看到很多人都在谈论获取null id错误,但是它既不适用于tomcat7,也不适用于tomcat8。
这就是为什么我不明白为什么在tomcat7上无法正常工作但在tomcat8或tomcat8.5上无法正常工作的原因。

PS。只是增加了混乱,如果我将 war 部署在tomcat8上但在Windows下运行正常。但是,如果我将其部署在linux下(官方docker alpine
tomcat 8容器)保存记录时通过null id的错误进行处理。

最佳答案

看来您的数据库正在返回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

关于postgresql - PostgreSQL 9.6分区表和gram 2.5.6 tomcat7或tomcat8下的怪异操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52440931/

相关文章:

java - 如何将 native 数据库运算符 (postgres ~) 与 JPA 条件生成器一起使用?

database - 两列中的任何一列总是多余的——有更好的解决方案吗?

html子元素中的grails/sitemesh布局设置属性(ng-app)

grails - Grails分页设置最高记录

grails - Geb-执行Ctrl + P

postgresql - 将空值插入 postgresql 中的 inet 字段

php - 值 10 重置为 1

java - Hibernate 从onetomany 中检索列表

java - Hibernate DB2 在使用 NativeQuery 时返回第一个字符 vector

java - 无法使用 JPA (hibernate) 和简单的 oneToMany - ManyToOne 关系来持久保存新的对象图