1

我的程序运行良好,直到我开始使用持久性并使用EntityManager @Inject.

抛出了很多错误,但我认为这是最阻塞的一个。

它说明了一个意想不到的元素,但我在网上找不到任何有用的信息。

日志:

Connected to server
[2017-05-16 09:13:17,808] Artifact web-example:war exploded: Artifact is being deployed, please wait...
mei 16, 2017 9:13:18 PM org.apache.tomee.catalina.TomcatWebAppBuilder deployWebApps
INFO: using default host: localhost
mei 16, 2017 9:13:18 PM org.apache.tomee.catalina.TomcatWebAppBuilder init
INFO: ------------------------- localhost -> /
mei 16, 2017 9:13:18 PM org.apache.tomee.catalina.TomEEClassLoaderEnricher validateJarFile
WARNING: jar '/Users/renzo/development/school/dea/spotitube/app/target/web-example-1.0-SNAPSHOT/WEB-INF/lib/hibernate-jpa-2.0-api-1.0.1.Final.jar' contains offending class: javax.persistence.Entity. It will be ignored.
mei 16, 2017 9:13:18 PM org.apache.tomee.catalina.TomEEClassLoaderEnricher validateJarFile
WARNING: jar '/Users/renzo/development/school/dea/spotitube/app/target/web-example-1.0-SNAPSHOT/WEB-INF/lib/jboss-transaction-api_1.1_spec-1.0.1.Final.jar' contains offending class: javax.transaction.Transaction. It will be ignored.
mei 16, 2017 9:13:18 PM org.apache.openejb.config.ConfigurationFactory configureApplication
INFO: Configuring enterprise application: /Users/renzo/development/school/dea/spotitube/app/target/web-example-1.0-SNAPSHOT
mei 16, 2017 9:13:18 PM org.apache.openejb.config.ReadDescriptors deploy
SEVERE: Unable to load Persistence Unit from EAR: /Users/renzo/development/school/dea/spotitube/app/target/web-example-1.0-SNAPSHOT, module: file:/Users/renzo/development/school/dea/spotitube/app/target/web-example-1.0-SNAPSHOT/WEB-INF/classes/. Exception: unexpected element (uri:"http://xmlns.jcp.org/xml/ns/persistence", local:"persistence"). Expected elements are <{http://java.sun.com/xml/ns/persistence}persistence>
javax.xml.bind.UnmarshalException: unexpected element (uri:"http://xmlns.jcp.org/xml/ns/persistence", local:"persistence"). Expected elements are <{http://java.sun.com/xml/ns/persistence}persistence>

/resources/META-INF/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
http://xmlns.jcp.org/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_1.xsd"
             version="2.1">
    <persistence-unit
            name="mysql"
            transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>

        <class>
            nl.han.dea.domain.User
        </class>

        <properties>
            <property name="hibernate.archive.autodetection" value="class"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/>
            <property name="hibernate.connection.driver_class" value="com.mysql.cj.jdbc.Driver"/>
            <property name="hibernate.connection.url"
                      value="jdbc:mysql://localhost:3306/Spotitube?autoReconnect=true&amp;useSSL=false&amp;serverTimezone=UTC"/>
            <property name="hibernate.connection.username" value="spotitube"/>
            <property name="hibernate.connection.password" value="java"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.flushMode" value="FLUSH_AUTO"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
        </properties>

    </persistence-unit>
</persistence>

pom.xml

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>nl.han.dea</groupId>
    <artifactId>web-example</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>web-example</name>

    <dependencies>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>6.0.6</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.2.6.Final</version>
        </dependency>
    </dependencies>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <failOnMissingWebXml>false</failOnMissingWebXml>
    </properties>
</project>
4

1 回答 1

2

问题在日志输出的这一行中变得很明显:

例外:意外元素(uri:“ http://xmlns.jcp.org/xml/ns/persistence ”,本地:“persistence”)。

预期的元素是 <{ http://java.sun.com/xml/ns/persistence }persistence

这告诉我们,它们与 JPA 2.0 和 2.1 版本不匹配。这种冲突的原因在于您在本文中提到的相当旧的 Hibernate 版本pom.xml

Hibernate 4.2.x 仅支持 JPA 2.0,而 TomEE 7.0.x 需要 JPA 2.1 提供程序,正如您persistence.xml在问题中提出的那样:

持久性 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 http://xmlns.jcp.org/xml/ns/persistence http://java .sun.com/xml/ns/persistence/persistence_2_1.xsd "版本="2.1">

有关 Hibernate 的 JPA 支持的更多详细信息,请参阅列出这些信息的Hibernate ORM下载页面。

解决方案

最有可能的是,将 Hibernate 的版本更改为 4.3.x 应该可以解决您遇到的一些问题。以下是相关依赖声明的样子:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>4.3.11.Final</version>
</dependency> 

如果您想进一步现代化您的应用程序,请尝试使用 Hibernate 5.2.xa。对于当前版本,依赖声明如下所示:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>5.2.10.Final</version>
</dependency

希望能帮助到你。

添加在

如果您想在 TomEE >=7.0.3 设置中使用 Hibernate 5.2.x,建议您添加

<property name="tomee.jpa.cdi" value="false" />

到您的persistence.xml,否则容器将在启动时抱怨注入问题。有关详细信息,请参阅此帖子此处

此外,将<provider>条目更改为新的/正确的包,如下所示:

<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
于 2017-05-25T15:39:24.937 回答