【问题标题】:org.h2.jdbc.JdbcSQLException: Schema "DBO" not foundorg.h2.jdbc.JdbcSQLException:找不到架构“DBO”
【发布时间】:2017-08-17 06:33:32
【问题描述】:

这是Hibernate version mismatch in WildFly 10.0的后续问题。

为了完整起见,请简要重申问题。我有2个项目,一个是普通的java项目(带有maven):core,另一个是非maven动态web项目:webapi。后者充当core之上的休息层。

core 使用休眠没有任何问题。它定义persistence.xml(在src/META-INF/内)如下:

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

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    version="2.0">

    <persistence-unit name="app" transaction-type="RESOURCE_LOCAL">

        <class>data.entities.Anything</class>
        <class>data.entities.Something</class>

        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"></property>
            <property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://localhost;databaseName=AppDb"></property>
            <property name="javax.persistence.jdbc.user" value="****"></property>
            <property name="javax.persistence.jdbc.password" value="****"></property>
            <property name="hibernate.default_schema" value="dbo"></property>           
            <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServer2008Dialect"></property>
            <property name="hibernate.hbm2ddl.auto" value="update"></property>
            <property name="jboss.as.jpa.providerModule" value="org.hibernate:5.2.4.Final" />
        </properties>
    </persistence-unit>
</persistence>

corewebapi 现在分别使用 hibernate-core 5.2.4.Final、maven 和 WildFly 模块安装,如 here 所述。

但是,现在当我将 webapi 部署到 WildFly 10.0 时,我收到以下错误:

[org.jboss.as.server.deployment](MSC 服务线程 1-8)WFLYSRV0027:开始部署“webapi.war”(运行时名称:“webapi.war”)

[org.jboss.as.jpa](MSC 服务线程 1-1)WFLYJPA0002:读取应用程序的 persistence.xml

[org.jboss.as.jpa](ServerService 线程池 -- 67)WFLYJPA0010:启动持久性单元(第 1 阶段,共 2 阶段)服务 'webapi.war#app'

[org.hibernate.jpa.internal.util.LogHelper] (ServerService 线程池 -- 67) HHH000204: 处理 PersistenceUnitInfo [ 名称:应用 ...]

[org.hibernate.orm.deprecation] (ServerService Thread Pool -- 67) HHH90000001: 发现指定扫描器 [hibernate.ejb.resource_scanner] 的不推荐使用设置;改用 [hibernate.archive.scanner]

[org.jboss.as.connector.deployers.jdbc](MSC 服务线程 1-1)WFLYJCA0004:部署 JDBC 兼容的驱动程序类 com.microsoft.sqlserver.jdbc.SQLServerDriver(6.0 版)

[org.jboss.as.connector.deployers.jdbc](MSC 服务线程 1-6)WFLYJCA0018:使用 driver-name = webapi.war_com.microsoft.sqlserver.jdbc.SQLServerDriver_6_0 启动驱动程序服务

[org.jboss.as.jpa](ServerService 线程池 -- 67)WFLYJPA0010:启动持久性单元(第 2 阶段,共 2 阶段)服务 'webapi.war#app'

[org.hibernate.dialect.Dialect](ServerService线程池--67)HHH000400:使用方言:org.hibernate.dialect.SQLServer2008Dialect

[org.hibernate.envers.boot.internal.EnversServiceImpl] (ServerService Thread Pool -- 67) Envers 集成启用了吗? : 是的

[org.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl](ServerService 线程池 -- 67)GenerationTarget 遇到异常接受命令:通过 JDBC 语句执行 DDL 时出错:org.hibernate.tool.schema.spi。 CommandAcceptanceException:通过 JDBC 语句执行 DDL 时出错 在 org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67) 在 org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlString(AbstractSchemaMigrator.java:524) 在 org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlStrings(AbstractSchemaMigrator.java:470) 在 org.hibernate.tool.schema.internal.AbstractSchemaMigrator.createTable(AbstractSchemaMigrator.java:273) 在 org.hibernate.tool.schema.internal.GroupedSchemaMigratorImpl.performTablesMigration(GroupedSchemaMigratorImpl.java:71) 在 org.hibernate.tool.schema.internal.AbstractSchemaMigrator.performMigration(AbstractSchemaMigrator.java:203) 在 org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:110) 在 org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:177) 在 org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:66) 在 org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:309) 在 org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:445) 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:877) 在 org.jboss.as.jpa.hibernate5.TwoPhaseBootstrapImpl.build(TwoPhaseBootstrapImpl.java:44) 在 org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:154) 在 org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:117) 在 org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:667) 在 org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:182) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:745) 在 org.jboss.threads.JBossThread.run(JBossThread.java:320)

原因:org.h2.jdbc.JdbcSQLException: Schema "DBO" not found; SQL 语句: 创建表 dbo.Anythings (Id binary(255) not null, CreatedOn datetime not null, IsActive bit, 主键 (Id)) [90079-173] 在 org.h2.message.DbException.getJdbcSQLException(DbException.java:331) 在 org.h2.message.DbException.get(DbException.java:171) 在 org.h2.message.DbException.get(DbException.java:148) 在 org.h2.command.Parser.getSchema(Parser.java:616) 在 org.h2.command.Parser.getSchema(Parser.java:623) 在 org.h2.command.Parser.parseCreateTable(Parser.java:5302) 在 org.h2.command.Parser.parseCreate(Parser.java:3873) 在 org.h2.command.Parser.parsePrepared(Parser.java:324) 在 org.h2.command.Parser.parse(Parser.java:279) 在 org.h2.command.Parser.parse(Parser.java:251) 在 org.h2.command.Parser.prepareCommand(Parser.java:218) 在 org.h2.engine.Session.prepareLocal(Session.java:428) 在 org.h2.engine.Session.prepareCommand(Session.java:377) 在 org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1138) 在 org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:168) 在 org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:156) 在 org.jboss.jca.adapters.jdbc.WrappedStatement.execute(WrappedStatement.java:198) 在 org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:54) ... 20 更多

有什么办法可以改正吗?

更新:我认为,它无法连接数据库。当我将hibernate.hbm2ddl.auto 用作validate 而不是update 时,出现以下错误:

org.hibernate.tool.schema.spi.SchemaManagementException:架构验证:缺少表 [dbo.Anythings]

附加信息:我已经将sqljdbc42.jar 放入wildfly-10.0.0.Final\modules\system\layers\base\com\microsoft\sqlserver\mainmodule.xml 如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!-- JDBC Drivers module.xml file to configure your JDBC drivers-->

<module xmlns="urn:jboss:module:1.3" name="com.microsoft.sqlserver" slot="main">
  <resources>
    <resource-root path="sqljdbc42.jar"/>
  </resources>
  <dependencies>
    <module name="javax.api"/>
    <module name="javax.transaction.api"/>
  </dependencies>
</module>

我还尝试将sqlserver 添加为standalone.xml 中的全局子系统:

<subsystem xmlns="urn:jboss:domain:ee:4.0">
    <global-modules>
        <module name="com.microsoft.sqlserver" slot="main"/>
    </global-modules>
...
</subsystem>

但是,这些都不起作用。

【问题讨论】:

    标签: java hibernate jpa wildfly sqljdbc


    【解决方案1】:

    这似乎是由您指定数据库连接的方式引起的。在 EE 环境中,您应该使用数据源定义,在 persistence.xml 中指定为 jta-data-sourcenon-jta-data-source。如 JPA 2.1 规范(第 8.2.1.5 章)中所述,如果您未指定其中任何一个,您的 Wildfly 将使用其默认数据源(名为 ExampleDS)部署您的应用程序,该数据源使用 h2 内存数据库。通过属性(javax.persistence.jdbc.url 等)的连接参数将被忽略,因为它们适用于 Java SE 环境而不是 Java EE。
    您需要将新的数据源定义添加到 wildfly 配置(standalone.xml 或 domain.xml,具体取决于您的设置),或者在您的应用程序中将数据源定义作为位于 WEB-INF 文件夹的名为 &lt;something&gt;-ds.xml 的文件提供。在这两种情况下,您都需要正确设置 MSSQL 驱动程序(部署到模块,添加 module.xml 并将驱动程序定义添加到 widlfly config /subsytem=datasources)。这些操作也可以通过 jboss-cli 界面来完成,以避免手动编辑配置文件。 之后,从您的 persistence.xml 中删除连接属性,并使用新创建的 DS 的 jndi 名称添加 jta/non-jta-data-source 元素。另外,请删除您的 mssql 模块的全局定义

    此链接可能对您有用: Wildfly Hibernate + In app datasource definition
    JBoss DB Driver+Data source definition via cli

    希望对您有所帮助。

    【讨论】:

    • +1 感谢您的回答。据我了解,如果我删除了properties,那么应用程序的core 部分将无法独立运行。有没有办法让两者都起作用?
    • 为什么需要让它同时在 SE 和 EE 中运行?如果您的应用程序包含其他托管组件,例如 EJB。等等,它现在可以在没有某种 EE 容器的情况下工作。从技术上讲,这些属性应该被您的 EE 容器忽略并在 SE 中得到尊重,如果这不起作用,您可以尝试在您的 SE 环境中手动创建 Datasource 并将其部署在与 jBoss 中相同的 JNDI 名称下。
    • 只是想评论其中一个引用的 URL 不再有效,现在是 Wildfly Hibernate + In app datasource definition - 顺便说一句,我遇到了与“问题”类似的问题
    猜你喜欢
    • 2013-07-26
    • 2022-06-22
    • 2013-05-24
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 2015-02-25
    • 2017-12-10
    • 1970-01-01
    相关资源
    最近更新 更多