#hibernate #orm #glassfish #jndi #sessionfactory
#гибернация #orm #glassfish #jndi #sessionfactory
Вопрос:
Я просто играю с внедрением Hibernate в качестве поставщика сохраняемости на сервере приложений Glassfish. Я уже настроил источник данных JNDI, пул соединений и т.д. Моя конфигурация гибернации выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.datasource">jdbc/myDatasource</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.factory_class">net.sf.hibernate.transaction.JTATransactionFactory</property>
<property name="hibernate.session_factory_name">hibernateSessionFactory</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">validate</property>
<property name="hibernate.current_session_context_class">thread</property>
<mapping class="org.me.jsf.entities.Node" />
</session-factory>
</hibernate-configuration>
Когда я пытаюсь использовать Session Factory таким образом:
try {
sessionFactory = (SessionFactory) new InitialContext()
.lookup("hibernateSessionFactory");
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
Я получаю исключение «ExceptionInInitializerError», вызванное, согласно журналам, «Ошибка поиска для ‘hibernateSessionFactory'». Но когда я использую этот код:
try {
AnnotationConfiguration cfg = new AnnotationConfiguration();
cfg.configure();
sessionFactory = cfg.buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
… все идет нормально.
Что я здесь не так понял? Я даже пытался создать запись для управляемого компонента hibernateSessionFactory для соответствующего класса в faces-config.xml , но по-прежнему безуспешно…
Ответ №1:
Наличие hibernate.session_factory_name
означает, что фабрика сеансов будет привязана к JNDI при создании, но вам все равно придется выполнять код, который создает ее во время запуска. Из документации Hibernate:
Hibernate автоматически поместит SessionFactory в JNDI после вызова cfg.buildSessionFactory(). Это означает, что у вас будет этот вызов в каком-либо коде запуска или служебном классе в вашем приложении, если вы не используете развертывание JMX с HibernateService (это обсуждается позже более подробно).
Комментарии:
1. Итак, по сути, чтобы использовать код, аналогичный неисправному, я должен настроить Hibernate как JMX от Glassfish?
2. @DoktorNo: Я не знаком с JMX. Однако вы можете использовать этот код, если вызываете
buildSessionFactory()
в коде запуска, например, вServletContextListener
.3. Спасибо, я попробую ServletContextListener, но все же я ищу решение, основанное исключительно на сервере приложений, поэтому JMX является вариантом.