Получение исключения java.lang.IllegalStateException: EntityManagerFactory закрывается при попытке сохранить исходное значение - PullRequest
0 голосов
/ 28 мая 2019

Я учусь в спящем режиме.В начале все ясно, однако, когда я пытаюсь запустить свое приложение и в основном у меня есть две операции, связанные с сессией, я получаю исключение:

java.lang.IllegalStateException: EntityManagerFactory is closed

Ниже вы можете найти мой класс DBManager, где я использую методыдля добавления экземпляров в БД:

import org.hibernate.Session;

public class DBManager
{
    public void addAutor(String name, String lastName, Book book)
    {
        Session session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        Autor autor = new Autor(name,lastName,book);
        session.save(autor);
        session.getTransaction().commit();
        HibernateUtil.getSessionFactory().close();
    }
    public Book addBook(int ISBN, String name, String autorName)
    {
        Session session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        Book book = new Book(ISBN,name,autorName);
        session.save(book);
        session.getTransaction().commit();
        HibernateUtil.getSessionFactory().close();
        return book;
    }
}

Вот мой класс HibernateUtil для конфигурации сеанса:

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            Configuration configuration = new Configuration();
            configuration.addAnnotatedClass(Autor.class);
            configuration.addAnnotatedClass(Book.class);
            configuration.configure();

            StandardServiceRegistryBuilder standardServiceRegistryBuilder = new StandardServiceRegistryBuilder();
            standardServiceRegistryBuilder.applySettings(configuration.getProperties());
            ServiceRegistry serviceRegistry = standardServiceRegistryBuilder.build();

            return configuration.buildSessionFactory(serviceRegistry);
        }
        catch(Exception e) {
            throw new ExceptionInInitializerError(e);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

И, наконец, основной класс:

public class Test
{

    public static void main (String args[])
    {
        DBManager dbManager = new DBManager();
        Book book =  dbManager.addBook(1,"Hobbit","Tolkien");
        dbManager.addAutor("JRR","Tolkien",book);
    }
}

Как видите, я просто поставил книгу, а потом попытался поставить Автора.В чем может быть причина исключения из метода secound?Я полагаю, что я делаю что-тонеправильно с закрытием и открытием сессии, однако я не могу понять, что не так.

1 Ответ

0 голосов
/ 28 мая 2019

Я сам нашел решение:

Я создал один объект sessionFactory для всего класса DBManager:

private final SessionFactory sessionFactory = HibernateUtil.getSessionFactory();

Так что в каждом методе я открываю сессию, а затем закрываю в конце, например:

    public void addAutor(String name, String lastName, Book book)
    {
        Session session=sessionFactory.openSession();
        session.beginTransaction();
        Autor autor = new Autor(name,lastName,book);
        session.save(autor);
        session.getTransaction().commit();
        session.close();
    }

Может быть, кто-то столкнется с той же проблемой.

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