Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hbm2ddl.auto设置为更新时发生休眠错误_Java_Hibernate_Jboss - Fatal编程技术网

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

Java hbm2ddl.auto设置为更新时发生休眠错误,java,hibernate,jboss,Java,Hibernate,Jboss,当我将hibernate.hbm2ddl.auto值设置为create时,没有出现错误, 但当我将其设置为“更新”时,我得到了一个错误。 我需要创建表并更新它们,所以我需要更新值。 有什么想法会出错吗 以下是错误: 15:55:19148错误[org.jboss.as.controller.management operation]控制器启动线程WFLYCTL0013:操作部署失败-地址:[部署=>WebService.war]-失败描述:{WFLYCTL0080:失败的服务=>{jboss.p

当我将hibernate.hbm2ddl.auto值设置为create时,没有出现错误, 但当我将其设置为“更新”时,我得到了一个错误。 我需要创建表并更新它们,所以我需要更新值。 有什么想法会出错吗

以下是错误:

15:55:19148错误[org.jboss.as.controller.management operation]控制器启动线程WFLYCTL0013:操作部署失败-地址:[部署=>WebService.war]-失败描述:{WFLYCTL0080:失败的服务=>{jboss.persistenceunit.\WebService.warswap\=>javax.persistence.PersistenceException:[持久化单元:交换]无法生成Hibernate SessionFactory 原因:javax.persistence.PersistenceException:[PersistenceUnit:swap]无法生成Hibernate SessionFactory 原因:org.hibernate.exception.sqlgrammareexception:无法生成数据库信息 原因:org.h2.jdbc.jdbcsql异常:未找到表\PG_类\n;SQL语句: 从pg_类中选择relname,其中relkind='S'[42102-193]} 15:55:19154信息[org.jboss.as.server]服务器服务线程池-37 WFLYSRV0010:已部署的WebService.war运行时名称:WebService.war 15:55:19155信息[org.jboss.as.server]服务器服务线程池-37 WFLYSRV0010:部署的test.war运行时名称:test.war 15:55:19155信息[org.jboss.as.controller]控制器引导线程WFLYCTL0183:服务状态报告 WFLYCTL0186:未能启动的服务:服务jboss.persistenceunit.WebService.warswap: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装载会有问题吗

编辑2: 以下是我的独立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>

问题在于方言和驱动程序集

hibernate使用带有Postgres方言的H2驱动程序

Caused by: org.h2.jdbc.JdbcSQLException:
您可以在hibernate日志中看到它使用的驱动程序和方言。 下面是显示hibernate日志外观的片段:

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
您可以在这个示例中看到hibernate使用的

h2jdbc驱动程序 org.hibernate.dial.h2方言
在stacktrace中,我们可以看到您的hibernate使用postgres方言OK,但H2驱动程序坏了

多亏了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"/>
现在它开始工作了!
谢谢大家的帮助。

由以下原因引起的错误状态:org.h2.jdbc.JdbcSQLException:Table\PG_CLASS\n未找到,您有足够的权限吗?premmisions是什么意思?在postgres上,每个用户都可以拥有更新等权限,创建并读取。我的用户是create的supseruser。这可能是问题吗?因此我需要更改什么才能使其工作?我在我的独立xmlHi中添加了数据源,我不知道jboss配置,但尝试从配置中删除任何H2驱动程序,并检查您的数据源现在是否使用org.postgresql驱动程序。删除H2驱动程序后,我收到一个新错误:WFLYCTL0412:未安装的必需服务:=>[jboss.jdbc-driver.h2,jboss.jdbc-driver.h2如果可能的话,您还应该删除需要h2的服务。例如,数据源java:jboss/datasources/ExampleDS使用h2驱动程序,正如我在您的配置中看到的那样。另一个尝试的选项是直接在JPA xml文件中配置数据源,以确保hibernate将使用什么。无论如何,正如我指出的,这不是hbm2dll的hibernate问题,这只是配置问题,因为jboss同时使用带有H2驱动程序和PostgresSQL方言的数据源。