Java 非常混乱、一致的Hibernate查找问题?

Java 非常混乱、一致的Hibernate查找问题?,java,spring,hibernate,h2,Java,Spring,Hibernate,H2,我们有一个由Hibernate支持的SpringWebApp用于存储。最近,我们注意到使用Hibernate存储对象执行查找时出现的问题。这是堆栈跟踪: org.h2.jdbc.JdbcSQLException: General error: "java.lang.RuntimeException: object already exists: TABLES"; SQL statement: SELECT VALUE FROM INFORMATION_SCHEMA.SETTINGS WHERE

我们有一个由Hibernate支持的SpringWebApp用于存储。最近,我们注意到使用Hibernate存储对象执行查找时出现的问题。这是堆栈跟踪:

org.h2.jdbc.JdbcSQLException: General error: "java.lang.RuntimeException: object already exists: TABLES"; SQL statement:
SELECT VALUE FROM INFORMATION_SCHEMA.SETTINGS WHERE NAME=? [50000-128]
        at org.h2.message.Message.getSQLException(Message.java:110)
        at org.h2.message.Message.convert(Message.java:287)
        at org.h2.command.Parser.prepareCommand(Parser.java:256)
        at org.h2.engine.Session.prepareLocal(Session.java:417)
        at org.h2.engine.Session.prepareCommand(Session.java:378)
        at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1074)
        at org.h2.jdbc.JdbcConnection.getQueryTimeout(JdbcConnection.java:679)
        at org.h2.jdbc.JdbcStatement.getQueryTimeout(JdbcStatement.java:547)
        at org.hibernate.jdbc.AbstractBatcher.closeQueryStatement(AbstractBatcher.java:299)
        at org.hibernate.jdbc.AbstractBatcher.closeQueryStatement(AbstractBatcher.java:234)
        at org.hibernate.loader.Loader.doQuery(Loader.java:770)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270)
        at org.hibernate.loader.Loader.doList(Loader.java:2449)
        at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2192)
        at org.hibernate.loader.Loader.list(Loader.java:2187)
        at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:452)
        at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
        at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
        at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1258)
        at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
        at com.ourapp.hibernate.HibernateDao.lookup(HibernateDao.java:173)
我很难确定到底是什么问题-SQL是否试图插入TABLES对象

我们的HibernateDao.lookup()方法,第173行:

172: Query query = session.createQuery("from " + entityClazz.getName() + " as entity where entity." + field + "='" + value + "'");
173: return query.list();

这似乎总是发生在同一个HibernateDao实例上(对于用户表,本质上是这样),并且每次都由相同的操作触发,但我们似乎无法确定实际问题是什么。

打开Hibernate参数和SQL日志记录。例如,在log4j.properties文件中:

log4j.logger.org.hibernate=INFO, hibernate
log4j.logger.org.hibernate.SQL=DEBUG, hibernate
log4j.logger.org.hibernate.type=TRACE #******this is the most important piece
log4j.appender.hibernate=org.apache.log4j.RollingFileAppender
log4j.appender.hibernate.File=/blah/logs/hibernate.log
log4j.appender.hibernate.MaxFileSize=10024KB
log4j.appender.hibernate.MaxBackupIndex=5
log4j.appender.hibernate.layout=org.apache.log4j.PatternLayout
log4j.appender.hibernate.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r[%t]%x - %C.%M(%F:%L) - %m%n

启用Hibernate参数和SQL日志记录。例如,在log4j.properties文件中:

log4j.logger.org.hibernate=INFO, hibernate
log4j.logger.org.hibernate.SQL=DEBUG, hibernate
log4j.logger.org.hibernate.type=TRACE #******this is the most important piece
log4j.appender.hibernate=org.apache.log4j.RollingFileAppender
log4j.appender.hibernate.File=/blah/logs/hibernate.log
log4j.appender.hibernate.MaxFileSize=10024KB
log4j.appender.hibernate.MaxBackupIndex=5
log4j.appender.hibernate.layout=org.apache.log4j.PatternLayout
log4j.appender.hibernate.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r[%t]%x - %C.%M(%F:%L) - %m%n


尝试使用H2的最新版本。您使用的是相对较旧的版本(2010-01-30版本1.2.128)。我敢肯定,要么您会收到更好的错误消息,要么问题就会消失。

尝试使用最新版本的H2。您使用的是相对较旧的版本(2010-01-30版本1.2.128)。我敢肯定,要么您会收到更好的错误消息,要么问题就会消失。

尝试手动运行生成的sql,看看发生了什么事web上的参数?您可以检查字段和值的值吗?尝试手动运行生成的sql并查看来自web的参数发生了什么?您能检查一下字段和值的值是多少吗?在hibernate.properties中,我启用了show_sql参数,并且我还有一个DATABASE_NAME.trace.db文件,旁边还有一个h2.db文件,该文件在我的原始问题中包含堆栈跟踪-上述更改是否会添加任何附加信息,或者只是将其附加到其他位置?另一个想法是hibernate经常(总是?)在运行select时刷新。如果您正在同一事务中修改此类型的对象(entityClazz),或者该实体没有实现equals(),则hibernate可能正在尝试写出该对象。具体取决于您希望如何配置log4j。该示例设置为hibernate将日志记录到自己的文件中。如果需要,您还可以将.type文件记录到另一个文件中。在hibernate.properties中,我启用了show_sql参数,并且我还有一个DATABASE_NAME.trace.db文件,旁边还有一个h2.db文件,其中包含我最初问题中的堆栈跟踪-上述更改是否会添加任何附加信息,或者只是将其附加到其他位置?另一个想法是hibernate经常(总是?)在运行select时刷新。如果您正在同一事务中修改此类型的对象(entityClazz),或者该实体没有实现equals(),则hibernate可能正在尝试写出该对象。具体取决于您希望如何配置log4j。该示例设置为hibernate将日志记录到自己的文件中。如果需要,您还可以将.type内容记录到另一个文件中。我们实际上使用的是1.3.164版本,是什么让您认为我们使用的是旧版本?版本号包含在异常错误代码中。错误代码为[50000-128],因此内部版本号为128。版本号128是1.2.128。你说得对,Thomas,Hibernate包含了H2依赖项,我们没有意识到。我们已经升级到Hibernate的最新版本,正在解决其他一些障碍,但一旦升级完成,我们将提供更多信息。谢谢。我们实际上使用的是1.3.164版本,是什么让你认为我们使用的是旧版本?版本号包含在异常错误代码中。错误代码为[50000-128],因此内部版本号为128。版本号128是1.2.128。你说得对,Thomas,Hibernate包含了H2依赖项,我们没有意识到。我们已经升级到Hibernate的最新版本,正在解决其他一些障碍,但一旦升级完成,我们将提供更多信息。谢谢