Tomcatのドキュメントによると:
Tomcatは読み取り専用を提供しますが、InitialContext
Hibernateは複数のセッションファクトリを管理するために読み取り/書き込みを必要とします。Tomcatは、管理されていないコンテナの仕様に従っているようです。セッションファクトリをJNDIオブジェクトにバインドする場合は、管理対象サーバー(Glassfish、JBossなど)に移動するか、インターネットで投稿された回避策を検索する必要があります。
Hibernateのドキュメントからの推奨事項は、hibernate.session_factory_name
Tomcatを操作するときにプロパティを省略して、JNDIへのバインドを試行しないことです。
そしてHibernateのドキュメントにも同じことが書かれています:
SessionFactoryをJDNI名前空間にバインドすると非常に便利です。ほとんどの場合、これはhibernate.session_factory_name
構成でプロパティを使用することが可能です。ただし、Tomcatでは
hibernate.session_factory_name
読み取り専用のJNDI実装を提供するため、Tomcatではプロパティを使用できません。TomcatでJNDIバインドを使用するには、Tomcatの構成SessionFactory
用のカスタムリソースファクトリクラスを記述し
SessionFactory
てセットアップする必要があります。
SessionFactory
したがって、次のようなカスタムを作成する必要があります。
package myutil.hibernate;
import java.util.Hashtable;
import java.util.Enumeration;
import javax.naming.Name;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.Reference;
import javax.naming.RefAddr;
import javax.naming.spi.ObjectFactory
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateSessionFactoryTomcatFactory implements ObjectFactory{
public Object getObjectInstance(Object obj, Name name, Context cntx, Hashtable env)
throws NamingException{
SessionFactory sessionFactory = null;
RefAddr addr = null;
try{
Enumeration addrs = ((Reference)(obj)).getAll();
while(addrs.hasMoreElements()){
addr = (RefAddr) addrs.nextElement();
if("configuration".equals((String)(addr.getType()))){
sessionFactory = (new Configuration())
.configure((String)addr.getContent()).buildSessionFactory();
}
}
}catch(Exception ex){
throw new javax.naming.NamingException(ex.getMessage());
}
return sessionFactory;
}
}