postgresqljava-ee-7hibernate-entitymanager

Unrecognized JPA persistence.xml XSD version : `` - hibernate, java ee and postgresql


The issue is appearing when trying to make entityManager with entitiManagerFactory. Application is running inside docker container and postgresql database is on localhost of the machine (not inside docker).

my persistence.xml

<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_1.xsd"
version="2.1">
<!-- Define persistence unit -->
<persistence-unit name="mypersistenceunit">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <class>some.path.SimplifiedUserGroup</class>
    <class>some.path.UserSettings</class>
    <class>some.path.UserGroupSettings</class>
    <class>some.path.UserGroup</class>
    <class>some.path.AppUser</class>
    <properties>
        <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />
        <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/localdatabase" />
        <property name="javax.persistence.jdbc.user" value="postgres" />
        <property name="javax.persistence.jdbc.password" value="postgres" />
    </properties>
</persistence-unit>

and the repository class:

public List<SimplifiedUserGroup> findAll() {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("mypersistenceunit");
    entityManager = emf.createEntityManager();
    return entityManager.createNamedQuery("UserGroup.findAll", SimplifiedUserGroup.class).getResultList();
}

there is an error:

javax.persistence.PersistenceException: Unable to locate persistence units

and then:

java.lang.IllegalArgumentException: Unrecognized JPA persistence.xml XSD version : ``

I tried several tutorials and read stackoverflow topics but nothing helps me - I tried with but didn't help. The same with versions 2.0, 2.1, 2.2. I have such dependencies in my pom.xml:

dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.4.2.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>5.3.6.Final</version>
    </dependency>

It would be great if I could create an entityManager and then connect to database (on localhost) and perform some queries... Thanks!


Solution

  • PersistenceException :

    If you use the EntityManagerFactory in a JavaEE environment you need to define the transaction-type to RESOURCE_LOCAL in your persistence.xml :

    <persistence-unit name="mypersistenceunit" transaction-type="RESOURCE_LOCAL">
    

    For more informations about the EntityManager and difference beetween transaction-type JTA and RESOURCE_LOCAL in the persistence.xml see this answer.


    Unrecognized JPA persistence.xml XSD version :

    In your persistence.xml :

    1. I dont see the persistence enclosing tag </persistence> after </persistence-unit> at the end.
    2. You are using an old URL for the XSD Schema Location, change your <persistence ... > to :
    <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"
      version="2.1">
    

    Informations from Oracle :

    Starting with the 2.1 version, the Java Persistence API Schemas share the namespace, http://xmlns.jcp.org/xml/ns/persistence/. Previous versions used the namespace http://java.sun.com/xml/ns/persistence/.