我正在努力将Hibernate实现为Glassfish应用服务器中的持久性提供程序。我已经配置了JNDI数据源,连接池等。我的Hibernate配置如下:
<?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);
}
......一切都很顺利。
我错在哪里?我甚至试图在faces-config.xml中为相关类创建托管bean hibernateSessionFactory的条目,但仍然没有运气......
答案 0 :(得分:1)
hibernate.session_factory_name
的存在意味着会话工厂在创建时将绑定到JNDI,但您仍然要执行在启动期间创建它的代码。来自Hibernate documentation:
在调用cfg.buildSessionFactory()之后,Hibernate会自动将SessionFactory放在JNDI中。这意味着您将在应用程序的某些启动代码或实用程序类中进行此调用,除非您使用HibernateService进行JMX部署(稍后将对此进行更详细的讨论)。