Wildfly 9 Hibernate使用H2数据库而不是MS SQL Server

时间:2016-01-17 12:31:53

标签: hibernate jpa java-ee wildfly h2

我的Java EE应用程序工作正常,但突然间它拒绝对数据库做任何事情。在重新部署时,我得到了以下stacktrace:

12:08:54,001 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (ServerService Thread Pool -- 69) Table "USERS" not found; SQL statement:
select userentity0_.id as id1_7_, userentity0_.password as password2_7_, userentity0_.username as username3_7_ from users userentity0_ [42102-173]
(...)
Caused by: org.h2.jdbc.JdbcSQLException: Table "USERS" not found; SQL statement:
select userentity0_.id as id1_7_, userentity0_.password as password2_7_, userentity0_.username as username3_7_ from users userentity0_ [42102-173]
        at org.h2.message.DbException.getJdbcSQLException(DbException.java:331)
(...)

我在这里注意到奇怪的事情。从stacktrace看来,它正在使用H2数据库驱动程序(或其他),而不是Microsoft SQL Server ,就像之前一样。我不记得最近用数据库改变了什么,它突然爆发了。

我发现这里已经提出了类似的问题: Wildfly mysql instead of h2 但是发布的答案并不令我满意 - 我希望它能在没有数据源的情况下工作,只需将所有数据库配置存储在persistence.xml中并保持应用程序与服务器无关(尽可能多)。

我的persistence.xml文件:

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
             http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
             version="2.1">

    <persistence-unit name="manager1" transaction-type="JTA">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <!-- some classes in <class> tags -->        
        <properties>
            <property name="hibernate.connection.driver_class" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
            <property name="hibernate.connection.url" value="jdbc:sqlserver://<my Azure database server>:1433;database=<db name>;user=<username>;password=<pass>;encrypt=true;hostNameInCertificate=*.database.windows.net;loginTimeout=30;"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServer2012Dialect"/>
            <!--<property name="hibernate.hbm2ddl.auto" value="update"/>-->
        </properties>
    </persistence-unit>
</persistence>

我应该更改什么才能让它再次使用MS SQL Server数据库?

1 个答案:

答案 0 :(得分:2)

您需要define容器中的MS SQL数据源。 Here's an example添加PosgreSQL驱动程序和数据源。

然后在你的persistence.xml中你定义了JTA数据源:

<jta-data-source>java:jboss/datasources/MSSqlDS</jta-data-source>

这是必需的,因为您希望容器管理您的交易。据我所知,您无法使用JTA定义连接参数。

您正在使用H2的原因是默认使用ExampleDS这是默认数据源。您可以将自己的数据源设置为默认数据源,也可以从<jta-data-source/>中取消persistence.xml

/substem=ee/service=default-bindings:write-attribute(name=datasource, value="java:jboss/datasources/MSSqlDS")

这会将默认数据源java:comp/DefaultDataSource设置为您定义的数据源。