-->

javax.persistence.PersistenceException - JPA+Hiber

2019-01-15 04:48发布

问题:

I am new to JPA, when I tried to run the following code, it showing error as "cvc-elt.1: Cannot find the declaration of element 'persistence'."

I cant able to fix this error, could u pls help me out to solve this issue.

Cheers

Rajesh

Persistance.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="jpa" transaction-type="JTA">

        <provider>org.hibernate.ejb.HibernatePersistence</provider>

        <class>com.optirisk.pojo.Department</class>
        <class>com.optirisk.pojo.Employee</class>

        <properties>
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.connection.username" value="NewsLetter1" />
            <property name="hibernate.connection.password" value="optiindia2012" />
            <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/orpss_hibernate_prototype" />
            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect" />
        </properties>

    </persistence-unit>
</persistence>

Application.java

public class Application {

    private static final String PERSISTENCE_UNIT_NAME = "jpa";
    private static EntityManagerFactory entityManagerFactory;

    public static void main(String[] args) throws Exception {

        entityManagerFactory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);

        EntityManager entityManager = entityManagerFactory.createEntityManager();
        entityManager.getTransaction().begin();

        Department department = new Department();
        department.setDeptName("IT");
        entityManager.persist(department);

        Employee emp1 = new Employee("Peter", "ROB", "454565");
        Employee emp2 = new Employee("Mathew", "Anderson", "222");

        emp1.setDepartment(department);
        emp2.setDepartment(department);

        entityManager.persist(emp1);
        entityManager.persist(emp2);

        entityManager.getTransaction().commit();
        entityManager.close();

    }

}

Error:

Exception in thread "main" javax.persistence.PersistenceException: Invalid persistence.xml.
Error parsing XML (line-1 : column -1): cvc-elt.1: Cannot find the declaration of element 'persistence'.
    at org.hibernate.ejb.packaging.PersistenceXmlLoader.loadURL(PersistenceXmlLoader.java:147)
    at org.hibernate.ejb.packaging.PersistenceXmlLoader.deploy(PersistenceXmlLoader.java:171)
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:325)
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:58)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:52)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:34)
    at com.jishraa.jpa.Application.main(Application.java:19)

回答1:

The issue is a mismatch between your <persistence version="2.1"...> and your hibernate library requirements. Copy and paste the whole persistence tag with name spaces (xmlns) from a reliable sample. Then check your library version, below.

From hibernate.org: http://hibernate.org/orm/downloads/

Supported JPA Versions

JPA 1.0: ORM 3.2+
JPA 2.0: ORM 3.5+
JPA 2.1: ORM 4.3+

Note that newer ORM releases are backwards compatible with older JPA versions (ex: ORM 4.3 with JPA 1.0). However, newer ORM releases may not be compatible with older JPA containers.

The JPA version is the same as the persistence version. The ORM is the version of hibernate. So your persistence file has <persistence version="2.1" ... >. So, as of now, you want only the hibernate library and version below (or a later version):

WEB-INF/lib/hibernate-entitymanager-4.3.0.Final.jar

or Maven pom.xml:

<!-- for JPA, use hibernate-entitymanager instead of hibernate-core -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>4.3.0.Final</version>
</dependency>

I spent a whole bunch of hours on this one. I hope my time spent saves yours!



回答2:

I suspect your environment only supports persistence 2.0. Try changing:

<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">

To:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0">


回答3:

you are missing the <persistence> element in your xml... check the xsd you posted and make your persistence.xml comply to the schema. See this link for a simple example