3

これが、セッションファクトリを取得する方法です。

    保護されたSessionFactorygetSessionFactory(){
        試す {
            return(SessionFactory)new InitialContext()
                    .lookup( "SessionFactory");
        } catch(例外e){
        }
    }

Javaコードで単純なjndiルックアップを介してSessionFactoryを取得できるようにするために、Tomcat6の単純なソリューションを提供してください。Tomcat側のどのファイルに何を書き込む必要がありますか?

4

2 に答える 2

2

ここにリンクがあり ますhttp://community.jboss.org/wiki/UsingJNDI-boundSessionFactorywithTomcat41

しかし、他の答えも歓迎します。

于 2010-03-19T09:05:47.753 に答える
0

Tomcatのドキュメントによると

Tomcatは読み取り専用を提供しますが、InitialContextHibernateは複数のセッションファクトリを管理するために読み取り/書き込みを必要とします。Tomcatは、管理されていないコンテナの仕様に従っているようです。セッションファクトリをJNDIオブジェクトにバインドする場合は、管理対象サーバー(Glassfish、JBossなど)に移動するか、インターネットで投稿された回避策を検索する必要があります。

Hibernateのドキュメントからの推奨事項は、hibernate.session_factory_nameTomcatを操作するときにプロパティを省略して、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;  
   }  
}  
于 2017-03-04T13:33:38.500 に答える