将hbm2ddl.auto设置为更新时发生休眠错误

时间:2018-11-17 14:03:02

标签: java hibernate jboss

当我设置hibernate.hbm2ddl.auto值来创建我没有错误时, 但是,当我将其设置为更新时,会出现错误。 我需要创建表并更新它们,所以我需要更新值。 有什么想法可能会出错吗?

这是错误:

  

15:55:19,148错误[org.jboss.as.controller.management-operation](控制器引导线程)​​WFLYCTL0013:操作(“ deploy”)失败-地址:([(“ deployment” =>“ WebService。 war]])-失败描述:{“ WFLYCTL0080:失败的服务” => {“ jboss.persistenceunit。\” WebService.war#swap \“” =>“ javax.persistence.PersistenceException:[PersistenceUnit:swap]无法建立Hibernate SessionFactory       原因:javax.persistence.PersistenceException:[PersistenceUnit:swap]无法构建Hibernate SessionFactory       引起原因:org.hibernate.exception.SQLGrammarException:无法生成DatabaseInformation       引起原因:org.h2.jdbc.JdbcSQLException:找不到表\“ PG_CLASS \”; SQL语句:   从pg_class中选择relname,其中relkind ='S'[42102-193]“}}   15:55:19,154 INFO [org.jboss.as.server](ServerService线程池-37)WFLYSRV0010:部署了“ WebService.war”(运行时名称:“ WebService.war”)   15:55:19,155 INFO [org.jboss.as.server](ServerService线程池-37)WFLYSRV0010:部署了“ test.war”(运行时名称:“ test.war”)   15:55:19,155 INFO [org.jboss.as.controller](控制器引导线程)​​WFLYCTL0183:服务状态报告   WFLYCTL0186:无法启动的服务:service jboss.persistenceunit。“ WebService.war#swap”:javax.persistence.PersistenceException:[PersistenceUnit:swap]无法构建Hibernate SessionFactory

这是我的持久性xml文件:

<?xml version="1.0" encoding="UTF-8"?>

http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd“>          org.hibernate.jpa.HibernatePersistenceProvider

<class>org.Swap.WebService.Model.User</class>
<class>org.Swap.WebService.Model.BaseEntity</class>

<properties>
        <!-- Hibernate properties -->
        <property name="hibernate.hbm2ddl.auto" value="update"/>
        <property name="hibernate.connection.zeroDateTimeBehavior" value="convertToNull" />
        <property name="hibernate.show_sql" value="false" />
        <property name="hibernate.format_sql" value="true" />
        <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>

        <!-- Database properties -->
        <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" /> <!-- DB Driver -->
        <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://127.0.0.1:5432/swap" /> <!-- BD Mane -->
        <property name="javax.persistence.jdbc.user" value="hidden" /> <!-- DB User -->
        <property name="javax.persistence.jdbc.password" value="hidden" /> <!-- DB Password -->
    </properties>
</persistence-unit>

编辑: 如果我以

开头
<property name="hibernate.hbm2ddl.auto" value="create"/>

然后将其设置为更新和发布,直到我重新启动wildfly为止。 加载wildfly会不会有问题?

EDIT2: 这是我的独立xml中的数据源:

 <datasources>
            <datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS" enabled="true" use-java-context="true">
                <connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE</connection-url>
                <driver>h2</driver>
                <security>
                    <user-name>sa</user-name>
                    <password>sa</password>
                </security>
            </datasource>
            <datasource jta="false" jndi-name="java:jboss/datasources/swap" pool-name="swap" enabled="true" use-java-context="true">
                <connection-url>jdbc:postgresql://127.0.0.1:5432/swap?useUnicode=yes&amp;characterEncoding=UTF-8</connection-url>
                <driver>org.postgresql</driver>
                <security>
                    <user-name>postgres</user-name>
                    <password>postgres</password>
                </security>
            </datasource>
            <drivers>
                <driver name="h2" module="com.h2database.h2">
                    <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
                </driver>
                <driver name="org.postgresql" module="org.postgresql">
                    <driver-class>org.postgresql.Driver</driver-class>
                    <xa-datasource-class>org.postgresql.Driver</xa-datasource-class>
                </driver>
            </drivers>
        </datasources>

2 个答案:

答案 0 :(得分:1)

问题与方言和驱动程序集有关。

您的休眠模式使用带有Postgres方言的H2驱动程序。

Caused by: org.h2.jdbc.JdbcSQLException:

您可以在休眠日志中查看其使用的驱动程序和方言。 以下是显示休眠日志外观的片段:

INFO  [Version] - HHH000412: Hibernate Core {4.3.7.Final}
INFO  [Environment] - HHH000206: hibernate.properties not found
INFO  [Environment] - HHH000021: Bytecode provider name : javassist
INFO  [MppNamingStrategy] - using naming strategy: MppNamingStrategy
INFO  [Version] - HCANN000001: Hibernate Commons Annotations {4.0.5.Final}
DEBUG [JdbcServicesImpl] - Driver ->
       name : H2 JDBC Driver
    version : 1.4.196 (2017-06-10)
      major : 1
      minor : 4
DEBUG [JdbcServicesImpl] - JDBC version : 4.0
INFO  [Dialect] - HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
INFO  [ASTQueryTranslatorFactory] - HHH000397: Using ASTQueryTranslatorFactory
INFO  [Version] - HV000001: Hibernate Validator 4.3.2.Final
INFO  [SchemaValidator] - HHH000229: Running schema validator

在此示例中您可以看到休眠使用的

  • H2 JDBC驱动程序
  • org.hibernate.dialect.H2Dialect

在您的堆栈跟踪中,我们可以看到您的休眠模式使用的是postgres方言(确定),但使用的是H2驱动程序(错误)

答案 1 :(得分:0)

多亏了przemek hertel,我设法让它正常工作。 我从数据源和驱动程序中删除了h2

<datasources>
            <datasource jndi-name="java:jboss/datasources/swap" pool-name="swap" enabled="true" use-java-context="true">
                <connection-url>jdbc:postgresql://127.0.0.1:5432/swap?useUnicode=yes&amp;characterEncoding=UTF-8</connection-url>
                <driver>org.postgresql</driver>
                <security>
                    <user-name>postgres</user-name>
                    <password>postgres</password>
                </security>
            </datasource>
            <drivers>
                <driver name="org.postgresql" module="org.postgresql">
                    <driver-class>org.postgresql.Driver</driver-class>
                    <xa-datasource-class>org.postgresql.Driver</xa-datasource-class>
                </driver>
            </drivers>
        </datasources>

我删除了这一行:

   <default-bindings context-service="java:jboss/ee/concurrency/context/default" datasource="java:jboss/datasources/ExampleDS" 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"/>

现在它正在工作! 谢谢大家的帮助。