Неожиданный элемент в Entitymanager Persistence.xml не работает

Моя программа работала отлично, пока я не начал использовать постоянство и с 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>

пом.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>

person CherryNerd    schedule 17.05.2017    source источник


Ответы (1)


Проблема становится очевидной в этой строке вывода журнала:

Исключение: неожиданный элемент (uri:"http://xmlns.jcp.org/xml/ns/persistence", local:"постоянство").

Ожидаемые элементы: ‹{http://java.sun.com/xml/ns/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/persistencepersistence.xml1.xsd http://xmlns.jcp.org/xml/ns/persistence http://java .sun.com/xml/ns/persistence/persistencepersistence.xml1.xsd" version="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.x. Для текущей версии объявление зависимости выглядит так:

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

Надеюсь, поможет.

Дополнение

Если вы хотите использовать Hibernate 5.2.x в установке TomEE >=7.0.3, рекомендуется добавить

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

к вашему persistence.xml, так как в противном случае контейнер будет жаловаться на проблемы с инъекцией при запуске. Подробности см. в этой публикации, а также здесь< /а>.

Кроме того, измените запись <provider> на новый/правильный пакет следующим образом:

<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
person MWiesner    schedule 25.05.2017