我通过createEntityManagerFactory得到了一个“无效的persistence.xml”,但没有@PersistenceContext

问题描述

我有一个项目,我们使用 Hibernate-jpa-2.1 并以此方式获得EntityManager距离

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

还有这个

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

因为某些类不是EJB,而另一些则不是(我想)。问题是 createEntityManagerFactory 失败并显示以下错误

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

这是 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>

我不明白为什么会这样,因为我的类在相同的包,相同的maven模块中,使用相同的Hibernate实体和相同的 persistence.xml

N.B。:不允许将此类设置为EJB。

解决方法

这是一个错误,只有在元素顺序错误(并且与此处发布的内容不相同)时,您才应该得到此错误。 persistence.xml中元素的顺序在验证期间很重要。它在xsd中进行了描述。每个persistence-unit中的内容如下:

  1. 说明
  2. 提供者
  3. jta-data-source
  4. 非jta数据源
  5. 映射文件
  6. jar文件
  7. 课程
  8. 排除未列出的类
  9. 共享缓存模式
  10. 验证模式
  11. 属性