I get an "Invalid persistence.xml" with createEntityManagerFactory but not @PersistenceContext

1.1k views Asked by At

I have a project where we use Hibernate-jpa-2.1 and get an EntityManager istance both in this way

@PersistenceContext(unitName = "common-api")
EntityManager em;

and this

    em = Persistence.createEntityManagerFactory("common-api").createEntityManager();

because some classes aren't EJB and others are (I guess). The problem is that the createEntityManagerFactory fails with the error:

Caused by: javax.persistence.PersistenceException: Invalid persistence.xml.
Error parsing XML [line : -1, column : -1] : cvc-complex-type.2.4.a: Invalid content was found starting with element 'class'. One of '{"http://xmlns.jcp.org/xml/ns/persistence":validation-mode, "http://xmlns.jcp.org/xml/ns/persistence":properties}' is expected.

        at org.hibernate.jpa.boot.internal.PersistenceXmlParser.validate(PersistenceXmlParser.java:357)
        at org.hibernate.jpa.boot.internal.PersistenceXmlParser.loadUrl(PersistenceXmlParser.java:290)
        at org.hibernate.jpa.boot.internal.PersistenceXmlParser.parsePersistenceXml(PersistenceXmlParser.java:94)
        at org.hibernate.jpa.boot.internal.PersistenceXmlParser.doResolve(PersistenceXmlParser.java:84)
        at org.hibernate.jpa.boot.internal.PersistenceXmlParser.locatePersistenceUnits(PersistenceXmlParser.java:66)
        at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilderOrNull(HibernatePersistenceProvider.java:80)
        ... 80 more

This is the persistence.xml:


<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" 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">
    <persistence-unit name="common-api" transaction-type="JTA">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <jta-data-source>(...)</jta-data-source>
        <class>(the only entity we have in this Maven module)</class>
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
        <validation-mode>NONE</validation-mode>
        <properties>
            <property name="javax.persistence.validation.mode" value="NONE" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL57InnoDBDialect" />
            <property name="hibernate.show_sql" value="false" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.order_updates" value="true" />
            <property name="hibernate.max_fetch_depth" value="2" />
            <property name="hibernate.use_sql_comments" value="true" />
            <property name="hibernate.use_identifer_rollback" value="true" />
            <property name="hibernate.jdbc.batch_size" value="0" />
            <property name="hibernate.jdbc.batch_versioned_data" value="false" />
            <property name="hibernate.jdbc.use_get_generated_keys" value="true" />
            <property name="hibernate.hbm2ddl.auto" value="none"/>
        </properties>
    </persistence-unit>
</persistence>

I don't understand why this happens because my classes are in the same package, same maven module, use the same Hibernate entities and the same persistence.xml.

N.B.: Making this class an EJB isn't an option.

1

There are 1 answers

14
coladict On

This is an error you should only get if the element order is wrong (and not the same as you posted here). The order of elements in persistence.xml is important during validation. It's described in the xsd. In each persistence-unit it is as follows:

  1. description
  2. provider
  3. jta-data-source
  4. non-jta-data-source
  5. mapping-file
  6. jar-file
  7. class
  8. exclude-unlisted-classes
  9. shared-cache-mode
  10. validation-mode
  11. properties