Ошибка при создании EntityManagerFactory: java.lang.NoClassDefFoundError - PullRequest
0 голосов
/ 10 октября 2019

У меня проблема с созданием фабрики менеджера сущностей. Я использую JPA для подключения к базе данных postgres. «Java_Lab_4» не похоже на допустимое имя модуля персистентности.

Я попытался назвать имя единицы персистентности org.apache.openjpa.persistence.PersistenceProviderImpl, но это не помогло.


    package model;

    import java.text.SimpleDateFormat;  
    import java.math.BigDecimal;
    import java.util.Date;
    import java.util.List;
    import java.util.Properties;
    import java.util.TreeSet;
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.Persistence;
    import javax.persistence.Query;


    public class Test {
        public static void main(String[] args) {

            Properties props = new Properties();

            props.put("openjpa.ConnectionURL", "jdbc:postgresql://localhost:5432/postgres");
            props.put("openjpa.ConnectionDriverName", "org.jdbc.Driver");
            props.put("openjpa.ConnectionUserName", "postgres");
            props.put("openjpa.ConnectionPassword", "stalker");
            props.put("openjpa.jdbc.SynchronizeMappings", "public");
    // the problem is here -->
            EntityManagerFactory emf = Persistence.createEntityManagerFactory("Java_Lab_4", props);
            saveEntities(emf);
            readEntities(emf);

        }

        private static void saveEntities(EntityManagerFactory emf) {
            EntityManager em = emf.createEntityManager();
            em.getTransaction().begin();

            try {

                Booking booking = new Booking();
                booking.setBooking_Code(BigDecimal.valueOf(12345.0));
                booking.setPaid("yes");
                booking.setPassenger_Code(1234);
                booking.setFlight_Code(BigDecimal.valueOf(9999));
                booking.setDate(new SimpleDateFormat("dd/MM/yyyy").parse("9/10/2019"));

                em.persist(booking);

                em.getTransaction().commit();

            } catch (Exception e) {
                e.printStackTrace();

                em.getTransaction().rollback();
            } finally {

                em.close();
            }
        }

        private static void readEntities(EntityManagerFactory emf) {
            EntityManager em;
            em = emf.createEntityManager();
            em.getTransaction().begin();

            try {

                Query query = em.createQuery("SELECT x FROM Group x");

                List<?> list = query.getResultList();

                if (!list.isEmpty()) {

                    for (Object object : list) {
                        Date date = ((Booking)list).getDate();
                        String paid = ((Booking)list).getPaid();
                        long passengerCode = ((Booking)list).getPassenger_Code();
                        BigDecimal flightCode = ((Booking)list).getFlight_Code();
                        BigDecimal bookingCode = ((Booking)list).getBooking_Code();
                        System.out.println("PassengerCode = " + passengerCode
                                + ", FlightCode = " + flightCode.toString() + ", BookingCode = " 
                                + bookingCode.toString() + ", Date = " + date.toString() 
                                + "Paid = " + paid);
                    }

                } else {
                    System.out.println("No booking");
                }

                em.getTransaction().commit();

            } catch (Exception e) {
                e.printStackTrace();

                em.getTransaction().rollback();
            } finally {

                em.close();
            }
        }
    }


Файл персистентности:


    <?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="Java_Lab_4">
            <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
            <class>model.Booking</class>
            <class>model.Category</class>
            <class>model.Flight</class>
            <class>model.Passenger</class>
            <class>model.Ticket</class>
        </persistence-unit>
    </persistence>

Exception in thread "main" java.lang.NoClassDefFoundError: org/jboss/logging/Logger
    at org.hibernate.jpa.HibernatePersistenceProvider.<clinit>(HibernatePersistenceProvider.java:38)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at java.lang.Class.newInstance(Unknown Source)
    at javax.persistence.spi.PersistenceProviderResolverHolder$DefaultPersistenceProviderResolver.getPersistenceProviders(PersistenceProviderResolverHolder.java:117)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:76)
    at model.Test.main(Test.java:26)
Caused by: java.lang.ClassNotFoundException: org.jboss.logging.Logger
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 9 more

1 Ответ

0 голосов
/ 11 октября 2019

Нет ничего неправильного в имени EntityManagerFactory - но вы пропустили класс в пути к классам.

Как уже упоминалось в комментарии к вашему вопросу, вам понадобится добавить jar-файл jboss-logging в ваш classpath.

НО - Hibernate имеет МНОЖЕСТВО зависимостей, так что если выСобираете банки самостоятельно, тогда вам понадобится много времени, чтобы получить их все, и в правильных версиях!

Вы можете скачать zip (70Mb), который содержит необходимые зависимости отсюда:

https://hibernate.org/orm/releases/5.4/

(используйте кнопку «скачать zip-архив» справа - это не так легко увидеть!)

Баночки находятся в «lib»папка, тогда есть несколько подпапок - на данный момент, по крайней мере, я бы просто выбросил все это в ваш путь к классам, за исключением дополнительной папки.

Если вы вообще знакомы с Maven или аналогичным (Gradle, что угодно), то я бы порекомендовал использовать его, тогда большинство зависимостей будет загружено автоматически, здесь есть руководство по этому вопросу: Maven - как добавить все необходимые зависимости для гибернации?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...