Недавно я создал веб-службу, которая использует статический метод в Java для получения списка элементов из базы данных.EntityManagerFactory закрыт, Hibernate
Веб-сервис отлично работает и возвращает JSON обратно вызывающему абоненту. Однако он работает только один раз. Если вы попытаетесь обновить или сделать новый запрос, я получаю ошибку EntityManagerFactory is closed
.
Вот как класс веб-службы выглядит следующим образом:
public class WebService extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//obtain the list of vehicles from the database
List<Vehicle> vehicles = ExecuteVehicle.getVehicleList();
//create the Gson object and generate the Json
Gson gson = new Gson();
JsonElement element = gson.toJsonTree(vehicles, new TypeToken<List<Vehicle>>(){}.getType());
//send the list of vehicles
JsonArray jsonArray = element.getAsJsonArray();
resp.setContentType("application/json");
resp.getWriter().print(jsonArray);
}
}
Как вы можете видеть, список транспортных средств заселяется с использованием метода ExecuteVehicle.getVehicleList()
.
Вот как этот метод выглядит следующим образом:
public static List<Vehicle> getVehicleList(){
//open a Session
Session session = HibernateUtilities.getSessionFactory().openSession();
//start a transaction
session.beginTransaction();
//SELECT STATEMENT for the entire list of Vehicles
Query<Vehicle> query = session.getNamedQuery("SelectAllVehicles"); //query name is declared in the mapping file
List<Vehicle> vehicles = query.list();
//commit the changes and end the transaction
session.getTransaction().commit();
//close the Session
session.close();
//close the SessionFactory
HibernateUtilities.getSessionFactory().close();
return vehicles;
}
Вот класс HibernateUtilities, который заботится о сессии и так далее:
public class HibernateUtilities {
private static SessionFactory sessionFactory;
private static StandardServiceRegistry standardServiceRegistry;
static{
try {
//configure and build the service registry
standardServiceRegistry = new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build();
//create the metadata
Metadata metadata = new MetadataSources(standardServiceRegistry).getMetadataBuilder().build();
//build the SessionFactory
sessionFactory = metadata.getSessionFactoryBuilder().build();
} catch (HibernateException e) {
//in case the SessionFactory cannot be built, then the stackTrace is displayed
e.printStackTrace();
}
}
//method that returns the Hibernate session factory
public static SessionFactory getSessionFactory(){
return sessionFactory;
}
}
Вопрос у меня есть, - как я могу избежать EntityManagerFactory is closed
ошибка. Кроме того, мне придется получать этот список снова и снова, в режиме реального времени. Это возможно с Hibernate? Получить список элементов из базы данных в режиме реального времени (скажем, каждые 2 секунды или около того)? Я знаю, что это зависит от количества элементов и т. Д., Но я спрашиваю с технической точки зрения - из того, что я понимаю, открытие и закрытие сеанса занимает много времени - я мог бы делать это снова и снова на той же сессии и если да, то как?
Спасибо!
Кажется, вы абсолютно правы. Интересно то, что я пробовал это в прошлом, и это не сработало. Возможно, я также удалил (закомментировал) строку 'session.close();' code. Я довольно полный новичок в Hibernate и не знаю точно, что все это делает, единственное, что я могу сделать, это «угадать» или искать в учебниках то, что именно они делают. В любом случае, похоже, что это работает! Большое спасибо! –
Кстати, есть ли «опасность» оставить SessionFactory открытым? Должен ли я об этом беспокоиться? –
Во всех приложениях, с которыми я работал, SessionFActory был создан один раз во время запуска и был уничтожен только тогда, когда приложение было закрыто. Создание Factory - очень интенсивный процесс, и как только он был создан, я оставил бы его в одиночестве. Вы должны закрывать свои сеансы, поскольку они являются работоспособными, но фабрика является апатридом, поэтому ее не нужно воссоздавать по запросу. –