【问题标题】:Could not complete schema update: org.h2.jdbc.JdbcSQLException: Table "PG_CLASS" not found; SQL statement无法完成架构更新:org.h2.jdbc.JdbcSQLException:找不到表“PG_CLASS”; SQL 语句
【发布时间】:2015-02-25 23:43:21
【问题描述】:

在 openshift 上部署应用程序时我遇到了下一个问题。我使用 wildfly 应用程序服务器和 PostgreSQL 墨盒。

在 persistence.xml 我设置属性“hibernate.hbm2ddl.auto” value="update"。在 org/main/postgresql 的 wildfly 模块中,我看到 wildfly 使用 postgresql-9.3-1102-jdbc41.jar

12:12:14,760 ERROR [org.hibernate.tool.hbm2ddl.SchemaUpdate] (ServerService Thread Pool -- 62) HHH000319: Could not get database metadata: org.h2.jdbc.JdbcSQLException: Table "PG_CLASS" not found; SQL statement:
select relname from pg_class where relkind='S' [42102-173]
        at org.h2.message.DbException.getJdbcSQLException(DbException.java:331)
        at org.h2.message.DbException.get(DbException.java:171)
        at org.h2.message.DbException.get(DbException.java:148)
        at org.h2.command.Parser.readTableOrView(Parser.java:4864)
        at org.h2.command.Parser.readTableFilter(Parser.java:1107)
        at org.h2.command.Parser.parseSelectSimpleFromPart(Parser.java:1713)
        at org.h2.command.Parser.parseSelectSimple(Parser.java:1821)
        at org.h2.command.Parser.parseSelectSub(Parser.java:1707)
        at org.h2.command.Parser.parseSelectUnion(Parser.java:1550)
        at org.h2.command.Parser.parseSelect(Parser.java:1538)
        at org.h2.command.Parser.parsePrepared(Parser.java:405)
        at org.h2.command.Parser.parse(Parser.java:279)
        at org.h2.command.Parser.parse(Parser.java:251)
        at org.h2.command.Parser.prepareCommand(Parser.java:218)
        at org.h2.engine.Session.prepareLocal(Session.java:428)
        at org.h2.engine.Session.prepareCommand(Session.java:377)
        at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1138)
        at org.h2.jdbc.JdbcStatement.executeQuery(JdbcStatement.java:72)
        at org.jboss.jca.adapters.jdbc.WrappedStatement.executeQuery(WrappedStatement.java:344)
        at org.hibernate.tool.hbm2ddl.DatabaseMetadata.initSequences(DatabaseMetadata.java:178) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
        at org.hibernate.tool.hbm2ddl.DatabaseMetadata.<init>(DatabaseMetadata.java:92) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
        at org.hibernate.tool.hbm2ddl.DatabaseMetadata.<init>(DatabaseMetadata.java:84) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
        at org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(SchemaUpdate.java:196) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
        at org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(SchemaUpdate.java:178) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
        at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:522) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1859) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:852) [hibernate-entitymanager-4.3.7.Final.jar:4.3.7.Final]
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:845) [hibernate-entitymanager-4.3.7.Final.jar:4.3.7.Final]
        at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:398) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:844) [hibernate-entitymanager-4.3.7.Final.jar:4.3.7.Final]
        at org.jboss.as.jpa.hibernate4.TwoPhaseBootstrapImpl.build(TwoPhaseBootstrapImpl.java:44) [jipijapa-hibernate4-3-1.0.1.Final.jar:]
        at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:154) [wildfly-jpa-8.2.0.Final.jar:8.2.0.Final]
        at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:117) [wildfly-jpa-8.2.0.Final.jar:8.2.0.Final]
        at java.security.AccessController.doPrivileged(Native Method) [rt.jar:1.8.0_05]
        at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:474) [wildfly-security-manager-1.0.0.Final.jar:1.0.0.Final]
        at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:182) [wildfly-jpa-8.2.0.Final.jar:8.2.0.Final]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0_05]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_05]
        at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_05]
        at org.jboss.threads.JBossThread.run(JBossThread.java:122) [jboss-threads-2.1.1.Final.jar:2.1.1.Final]

我使用休眠作为 JPA (hibernate-core-4.3.6)。而且我认为这个问题与 Postgresql 9.2 和 9.3 的不同版本有关 谁能解释我如何在 9.2 Postgres 版本中更改休眠方言或在 openshift 上更改 postgresql 库模块?

【问题讨论】:

  • 该查询select relname from pg_class where relkind='S' 应该适用于几乎任何版本的 postgresql。不过,错误消息报告表名大写的事实似乎很可疑。
  • @Klimov Piter 该表被称为"pg_catalog"."pg_class" 最肯定不是"PG_CLASS" 尽管PG_CLASS 通常是可以接受的,引号使大写更重要,我不完全相信hybernate 开发人员不会通过在表名中添加虚假引号来混淆错误消息。 postgres 服务器日志中应该有匹配的错误。请您将其添加到问题中。
  • @Jasen 非常感谢!我将我的休眠属性文件从 hibernate.hbm2ddl.auto = "update" 更改为 "create",它对我有帮助
  • 如果此问题已解决,请在此处发布您的解决方案(作为答案)。一周后您将能够接受该答案,并且此问题将被标记为已解决。
  • 您显然使用的是 H2,而不是 Postgres。 H2 没有名为pg_class的表

标签: java hibernate postgresql jdbc openshift


【解决方案1】:

我刚刚将休眠属性hibernate.hbm2ddl.auto 更改为create。这为我解决了这个问题。

【讨论】:

    【解决方案2】:

    最近有同样的错误。请打开您的 Wildfly 的standalone.xml(或standalone-full.xml 或您正在使用的任何一个)并找到并删除以下片段:

    <default-bindings contextservice="java:jboss/ee/concurrency/context/default" datasource="java:jboss/datasources/ExampleDS" jms-connection factory="java:jboss/DefaultJMSConnectionFactory" managed-executor-service="java:jboss/ee/concurrency/executor/default" managed-scheduled-executor-service="java:jboss/ee/concurrency/scheduler/default" managed-thread-factory="java:jboss/ee/concurrency/factory/default"/>
    

    重要提示:编辑前请务必关闭wildfly,否则下次关闭时会覆盖更改。

    【讨论】:

    • 好问题!老实说 - 我不确定。似乎此默认 DS 部分覆盖了此应用程序服务器上部署的数据库连接设置。我没有进一步深入研究它,但是一旦我开始工作......
    • 当您将应用程序从 H2 迁移到 PostgreSQL 并且忘记更新所有连接字符串时,也会发生同样的错误。
    • 我无法确认这是否解决了问题。如果您遇到同样的情况,请查看下面我的答案(与静态元模型不一致)。
    【解决方案3】:

    你需要这个属性 spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

    【讨论】:

      【解决方案4】:

      1) 检查您是否在 application.properties 中使用了正确的方言

      spring.jpa.database-platform
      

      2) 并检查spring.jpa.hibernate.ddl-auto的值

      【讨论】:

        【解决方案5】:

        spring.jpa.database-platform 解决了我的问题

        【讨论】:

        • 请详细说明。
        【解决方案6】:

        当我的实体和持久性元模型类(例如 Customer_.java)也不一致时,我看到了这个异常。 Wildfly 也报告了这种不一致。当我解决了这些不一致时,它就消失了。

        【讨论】:

          猜你喜欢
          • 2013-07-26
          • 2017-12-10
          • 2016-12-06
          • 2017-08-17
          • 1970-01-01
          • 2022-06-22
          • 1970-01-01
          • 2019-09-28
          • 2020-04-23
          相关资源
          最近更新 更多