java - 获取异常 java.lang.IllegalStateException: EntityManagerFactory is closed while trying to save secound istance
问题描述
我正在学习休眠。开始时一切都很清楚,但是当我尝试运行我的应用程序时,我主要有两个与会话相关的操作,但出现异常:
java.lang.IllegalStateException: EntityManagerFactory is closed
您可以在下面找到我的 DBManager 类,其中我有将实例添加到 DB 的方法:
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);
}
}
正如你所看到的,我只是放书,而不是尝试放 Autor。第二种方法异常的原因可能是什么?我想我会做某事。关闭和打开会话时出错,但是我不知道出了什么问题。
解决方案
I found the sulution myself:
I have created the one sessionFactory object for whole class DBManager:
private final SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
So in every method I open session, and than close at the end, eg:
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();
}
Maybe someone will face the same problem.
推荐阅读
- r - 如何在 R 数据框中生成一个新列,其中包含来自多列的有序项
- tensorflow - 试图将 lasagne.layers.SliceLayer(input_from_previous_layer, -1, 1) fom theano 转换为 keras
- authentication - OpenShift 中的身份验证日志在哪里?
- selenium - 即使页面加载完毕,Selenium 也无法点击 Element
- google-oauth - 如果我在 iframe 外部单击,一键登录隐藏
- vba - 在不同的 IDE 中处理 Word 宏
- python -
如何使用 Python获取标签前后的字符串 - java - 尝试在我的 Java Spring API 中实现 Swagger 时出现错误消息
- css - 引导导航居中链接
- d3.js - 如何像geoMercator一样使geoAlbersUSA投影笔直(不弯曲)?