Hibernate problem with PersistenceUnit creates breakpoints (Unable to build Hibernate SessionFactory)

Viewed 43

Exception in thread "main" java.lang.ExceptionInInitializerError Caused by: javax.persistence.PersistenceException: [PersistenceUnit: MyUnit] Unable to build Hibernate SessionFactory at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:1597) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1503) at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:56) at java.persistence@2.2/javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79) at java.persistence@2.2/javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54) at com.example.Main/com.example.Main.TestHibernate.(TestHibernate.java:11) Caused by: org.hibernate.MappingException: Could not instantiate persister org.hibernate.persister.entity.SingleTableEntityPersister at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:112) at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:77) at org.hibernate.metamodel.internal.MetamodelImpl.initialize(MetamodelImpl.java:181) at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:319) at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:471) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1498) ... 4 more Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field private long com.example.Main.Database.Test.id accessible: module com.example.Main does not "opens com.example.Main.Database" to unnamed module @7f1302d6 at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:178) at java.base/java.lang.reflect.Field.setAccessible(Field.java:172) at org.hibernate.internal.util.ReflectHelper.ensureAccessibility(ReflectHelper.java:418) at org.hibernate.internal.util.ReflectHelper.findField(ReflectHelper.java:408) at org.hibernate.property.access.internal.PropertyAccessFieldImpl.(PropertyAccessFieldImpl.java:34) at org.hibernate.property.access.internal.PropertyAccessStrategyFieldImpl.buildPropertyAccess(PropertyAccessStrategyFieldImpl.java:26) at org.hibernate.tuple.PropertyFactory.getGetter(PropertyFactory.java:341) at org.hibernate.tuple.PropertyFactory.buildIdentifierAttribute(PropertyFactory.java:67) at org.hibernate.tuple.entity.EntityMetamodel.(EntityMetamodel.java:142) at org.hibernate.persister.entity.AbstractEntityPersister.(AbstractEntityPersister.java:613) at org.hibernate.persister.entity.SingleTableEntityPersister.(SingleTableEntityPersister.java:126) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:96) ... 9 more

Test.java

@Entity
public class Test
{
    @Id
    @GeneratedValue
    private long id;
    private String imie;
    private String nazwisko;

    public Test(long id, String imie, String nazwisko)
    {
        this.id = id;
        this.imie = imie;
        this.nazwisko = nazwisko;
    }

    public Test()
    {
    }

    public long getId()
    {
        return id;
    }

    public void setId(long id)
    {
        this.id = id;
    }

    public String getImie()
    {
        return imie;
    }

    public void setImie(String imie)
    {
        this.imie = imie;
    }

    public String getNazwisko()
    {
        return nazwisko;
    }

    public void setNazwisko(String nazwisko)
    {
        this.nazwisko = nazwisko;
    }

    @Override
    public String toString()
    {
        return "Test{" +
                "id=" + id +
                ", imie='" + imie + '\'' +
                ", nazwisko='" + nazwisko + '\'' +
                '}';
    }
}

TestService.java

public class TestService
{
    //Nie dziala
    public void addUser(String imie, String nazwisko)
    {
        Test test = new Test();
        test.setImie(imie);
        test.setNazwisko(nazwisko);
        EntityManager entityManager = TestHibernate.getFactory().createEntityManager();
        EntityTransaction entityTransaction = entityManager.getTransaction();
        entityTransaction.begin(); 
        entityManager.persist(test);
        entityTransaction.commit(); 
    }

    public Test findOne(long id) {
        EntityManager entityManager = TestHibernate.getFactory().createEntityManager();
        return entityManager.find(Test.class, id);
    }
}

TestHibernate.java

public class TestHibernate
{
    private static final EntityManagerFactory FACTORY =
            Persistence.createEntityManagerFactory("MyUnit");

    public static void main(String[] args)
    {
        TestService testService = new TestService();
        testService.findOne(1);
    }
    
    public static EntityManagerFactory getFactory()
    {
        return FACTORY;
    }
}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId> <!-- To moze miec wplyw -->
    <artifactId>Game</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>Game</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <junit.version>5.8.1</junit.version>

        <!--DODANIE PROPERTIES -->
        <maven.compiler.source>16</maven.compiler.source>
        <maven.compiler.target>16</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>18-ea+6</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>18-ea+6</version>
        </dependency>

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.openjfx/javafx.media -->
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-media</artifactId>
            <version>18.0.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.3.6</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.6.9.Final</version>
            <type>pom</type>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->
        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.6.9.Final</version>
        </dependency>    
    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>17</source>
                    <target>17</target> 
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.8</version>
                <executions>
                    <execution>
                        <!-- Default configuration for running with: mvn clean javafx:run -->
                        <id>default-cli</id>
                        <configuration>
                            <mainClass>com.example.game/com.example.game.StartLoginApplication</mainClass>
                            <launcher>app</launcher>
                            <jlinkZipName>app</jlinkZipName>
                            <jlinkImageName>app</jlinkImageName>
                            <noManPages>true</noManPages>
                            <stripDebug>true</stripDebug>
                            <noHeaderFiles>true</noHeaderFiles>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
             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">
    <persistence-unit name="MyUnit" transaction-type="RESOURCE_LOCAL"> <!-- Tutaj nazwa MyUnit - wyrzuca blad -->
        <!-- Persistence provider -->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <!-- Entity classes -->
        <class>com.example.Main.Database.Test</class>
        <properties>
            <!-- Musisz pozmieniac na swoje dane -->
            <!-- The JDBC driver of your database -->
            <property name="javax.persistence.jdbc.driver"
                      value="org.postgresql.Driver" />
            <!-- The JDBC URL to the database instance -->
            <property name="javax.persistence.jdbc.url"
                      value="jdbc:postgresql://localhost:5432/Nowa" />
            <!-- The database username -->
            <property name="javax.persistence.jdbc.user" value="postgres" />
            <!-- The database password -->
            <property name="javax.persistence.jdbc.password" value="Bakalie37" />

        </properties>
    </persistence-unit>
</persistence>

It's weird, cause in the similar project I haven't problems with that. Second project without problems:

Company.java

@Entity
public class Company {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    private int age;

    private String address;

    private double salary;

    public Company() {
    }

    public Company(Long id, String name, int age, String address, double salary) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.address = address;
        this.salary = salary;
    }

    public Company(String name, int age, String address, double salary) {
        this.name = name;
        this.age = age;
        this.address = address;
        this.salary = salary;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Company{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                ", salary=" + salary +
                '}';
    }
}

CompanyService.java

public class CompanyService {

    public Company findOne(long id) {
        EntityManager entityManager = Main.getFactory().createEntityManager();
        return entityManager.find(Company.class, id);
    }

    public void addCompany(String name, int age, String address, double salary) {
        Company company = new Company();
        company.setName(name);
        company.setAge(age);
        company.setAddress(address);
        company.setSalary(salary);
        EntityManager entityManager = Main.getFactory().createEntityManager();
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();
        entityManager.contains(company);
        transaction.commit();
    }

    public List<Company> findByName(String name) {
        EntityManager entityManager = Main.getFactory().createEntityManager();
        Query query = entityManager.createQuery("select c from Company c where c.name='" + name + "'");
        return query.getResultList();
    }

    public List<Company> findAll() {
        EntityManager entityManager = Main.getFactory().createEntityManager();
        Query query = entityManager.createQuery("select c from Company c");
        return query.getResultList();
    }

    public void updateCompanyName(long id, String name) {
        EntityManager entityManager = Main.getFactory().createEntityManager();
        Company company = entityManager.find(Company.class, id);
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();
        company.setName(name);
        entityManager.merge(company);
        transaction.commit();
    }

    public void delete(long id) {
        EntityManager entityManager = Main.getFactory().createEntityManager();
        Company company = entityManager.find(Company.class, id);
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();
        entityManager.remove(company);
        transaction.commit();
    }

}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>groupId</groupId>
    <artifactId>JPAZad1</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>16</maven.compiler.source>
        <maven.compiler.target>16</maven.compiler.target>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.3.6</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.6.9.Final</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.6.9.Final</version>
        </dependency>
    </dependencies>
    
</project>

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
             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">
    <persistence-unit name="MyUnit" transaction-type="RESOURCE_LOCAL">
        <!-- Persistence provider -->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <!-- Entity classes -->
        <class>com.company.Donica.Company</class>
        <properties>
            <!-- The JDBC driver of your database -->
            <property name="javax.persistence.jdbc.driver"
                      value="org.postgresql.Driver" />
            <!-- The JDBC URL to the database instance -->
            <property name="javax.persistence.jdbc.url"
                      value="jdbc:postgresql://localhost:5432/Nowa" />
            <!-- The database username -->
            <property name="javax.persistence.jdbc.user" value="postgres" />
            <!-- The database password -->
            <property name="javax.persistence.jdbc.password" value="Bakalie37" />

        </properties>
    </persistence-unit>
</persistence>
0 Answers
Related