【问题标题】:Wildfly 8.2.0.Final: Misconfiguration because of example datasource or persistence.xml?Wildfly 8.2.0.Final:由于示例数据源或 persistence.xml 导致配置错误?
【发布时间】:2015-08-23 19:41:24
【问题描述】:

我在我的 persistence.xml 中配置了三个数据源:

<?xml version="1.0" encoding="UTF-8"?>
<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="MyPersistenceUnit" transaction-type="JTA">
        <jta-data-source>java:jboss/datasources/myDS</jta-data-source>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
            <property name="hibernate.connection.useUnicode" value="true" />
            <property name="hibernate.connection.characterEncoding" value="UTF-8" />
            <property name="hibernate.connection.charSet" value="UTF-8" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.hbm2ddl.auto" value="validate" />
        </properties>
    </persistence-unit>

    <persistence-unit name="MyPersistenceTestUnit" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
            <property name="hibernate.connection.useUnicode" value="true" />
            <property name="hibernate.connection.characterEncoding" value="UTF-8" />
            <property name="hibernate.connection.charSet" value="UTF-8" />
            <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/mydb" />
            <property name="hibernate.connection.username" value="myuser" />
            <property name="hibernate.connection.password" value="mypass" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.hbm2ddl.auto" value="validate" />
        </properties>
    </persistence-unit>

    <persistence-unit name="MyLoggingUnit" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
            <property name="hibernate.connection.useUnicode" value="true" />
            <property name="hibernate.connection.characterEncoding" value="UTF-8" />
            <property name="hibernate.connection.charSet" value="UTF-8" />
            <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/mydb" />
            <property name="hibernate.connection.username" value="myuser" />
            <property name="hibernate.connection.password" value="mypass" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.hbm2ddl.auto" value="validate" />
        </properties>
    </persistence-unit>

</persistence>

第一个是“默认”单位。它由标准实体管理器使用。在 Java EE 环境之外运行 JUnit 测试需要第二个。第三个用于独立于 JTA 事务的日志记录。
这行得通。但是当我启动 Wildfly 时,我什至得到了一些这样的错误(虽然我的应用程序中没有使用 H2):

21:32:33,748 ERROR [org.hibernate.tool.hbm2ddl.SchemaValidator] (ServerService Thread Pool -- 51) 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)

只有在部署应用程序时才会发生。

这个想法是通过管理控制台或在standalone.xml中禁用或删除ExampleDS,但是当我这样做时,我得到一个错误的启动:

21:36:20,992 ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) JBAS014613: Operation ("deploy") failed - address: ([("deployment" => "com.zonacroft.mycuisine.webserver-TRUNK.war")]) - failure description: {"JBAS014771: Services with missing/unavailable dependencies" => [
    "jboss.persistenceunit.\"com.mydomain.myapp.webserver-TRUNK.war#MyLoggingUnit\".__FIRST_PHASE__ is missing [jboss.data-source.java:jboss/datasources/ExampleDS]",
    "jboss.persistenceunit.\"com.mydomain.myapp.webserver-TRUNK.war#MyPersistenceTestUnit\".__FIRST_PHASE__ is missing [jboss.data-source.java:jboss/datasources/ExampleDS]"

这里到底发生了什么?为什么这个persistence.xml 需要exampleDS? RESOURCE_LOCAL 持久性单元是否配置错误? (但如果是这样,那么它们为什么会起作用)。那么这里有什么问题呢?

[更新]
我发现当我从RESOURCE_LOCAL 持久性单元中删除hibernate.hbm2ddl.auto 属性时,我没有收到启动错误(启用了exampleDS)。但这让我很恼火,我必须让 Wildfly 的 exampleDS 启用。否则,Wildfly 不会像上面描述的那样启动应用程序。为什么会这样。这里有什么问题?

【问题讨论】:

  • 无法回答您的具体问题,但ExampleDS 用于平台默认数据源,这是 Java EE 7 中引入的一项新功能。我个人不喜欢使用资源本地 PU用于单元测试。恕我直言,使用真正的持久性单元进行测试(例如使用 Arquillian)可以进行更真实的测试。

标签: datasource wildfly wildfly-8 persistence.xml persistence-unit


【解决方案1】:

您只需为第一个持久性单元定义一个数据源:

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

这意味着 WildFly 将默认数据源 exampleDS 用于您的其他持久性单元。

这会导致异常,因为配置的 PostgreSQL 方言不适用于默认的 H2 数据源。

【讨论】:

  • 没错,但我无法设置非 jta 数据源(因为那时会发生其他错误),我不需要一个,因为所需的参数是在持久性单元中设置的,它是本地资源。那么现在真正的解决方案是什么?
  • 当我尝试测试我的日志记录时,它根本不起作用(在 JEE 环境中)。但是,当我将 JTA 数据源的属性与相同的数据源但作为非 jta 数据源和 RESOURCE_LOCAL 作为事务类型使用时,日志记录 PU 起作用。这里也可以“验证”。我不确定我是否完全理解为什么第一个定义不起作用,但这是另一个问题。
猜你喜欢
  • 2016-03-15
  • 2015-04-25
  • 2015-12-12
  • 2013-10-30
  • 2013-04-30
  • 2015-10-09
  • 1970-01-01
  • 2015-07-17
  • 1970-01-01
相关资源
最近更新 更多