4

構成ファイルを使用せずに、アプリに組み込みの tomcat インスタンスを構成しようとしています。

私はいくつかの調査を行い、この長いチュートリアル短いチュートリアルに基づいて、この手順を抽出しました。

  1. 作成するServletContextListener

    @WebListener //some articles on the web mentioned, that this would add the 
    //Listener automatically to the app context, but i cant believe that this works in my case
    public class HibernateListener implements ServletContextListener {
    
        public void contextInitialized(ServletContextEvent event) {
            HibernateUtil.getSessionFactory(); // create a factory
        }
    
        public void contextDestroyed(ServletContextEvent event) {
            HibernateUtil.getSessionFactory().close(); // free resources
        }
    }
    
  2. そのリスナーをアプリ コンテキストに追加します。

    Context rootCtx = tomcat.addContext("", base.getAbsolutePath());
    rootCtx.getServletContext().addListener("com.example.listeners.HibernateListener");
    
    tomcat.start();
    tomcat.getServer().await();
    
  3. HibernateUtil必要な構成でクラスを実装する

    public class HibernateUtil {
    
        private static final SessionFactory sessionFactory;
    
        static {
            try {
                //should i call .configure() on the returned Configuration here?                
                sessionFactory = getConfiguration()
                        .buildSessionFactory();
            } catch (Throwable ex) {
                System.err.println("Initial SessionFactory creation failed." + ex);
                throw new ExceptionInInitializerError(ex);
            }
    
        }
    
        private static Configuration getConfiguration(){
            Configuration c = new Configuration();
    
            c.setProperty("hibernate.connection.url", "jdbc:hsqldb:hsql://localhost:1234/mydb1");
            c.setProperty("hibernate.connection.username", "SA");
            c.setProperty("hibernate.connection.password", "");
            c.setProperty("hibernate.connection.driver_class", "org.hsqldb.jdbcDriver");
    
    
            c.setProperty("dialect", "org.hibernate.dialect.HSQLDialect");
            c.setProperty("cache.provider_class", "org.hibernate.cache.NoCacheProvider");
            c.setProperty("cache.use_query_cache", "false");
            c.setProperty("cache.use_minimal_puts", "false");
            c.setProperty("max_fetch_depth", "3");
    
            c.setProperty("show_sql", "true");
            c.setProperty("format_sql", "true");
            c.setProperty("hbm2ddl.auto", "create");
    
            c.addPackage("com.example.models");
            c.addAnnotatedClass(MyClass.class);
    
            return c;
        }
    
        public static SessionFactory getSessionFactory() {
            return sessionFactory;
        }
    }
    
  4. 今、どうにかしMyClassて、休止状態を介してリンクされたデータベースからデータを作成および取得する必要がありますよね? (今のところ、正確にはわかりませんが、それはここでのポイントではありません)

しかし、残念ながらNullPointerException、リスナーをTomcatに追加しようとすると、エラーが発生します

org.apache.catalina.core.ApplicationContext.addListener(ApplicationContext.java:1278) でのスレッド「メイン」java.lang.NullPointerException org.apache.catalina.core.ApplicationContextFacade.addListener(ApplicationContextFacade.java:649) での例外

ラインを指すrootCtx.getServletContext().addListener("com.example.listeners.HibernateListener");

編集1

しかし、休止状態のスタンドアロン(Tomcat なし) を実行している場合は、正常に動作します。データはエラーなしで保存されています!

HibernateUtil

public static void main(String[] args) {
    MyClass mycls = new MyClass();

    mycls.setMyProperty("My Property");
    Session session = getSessionFactory().openSession();
    Transaction transaction = session.beginTransaction();
    session.save(mycls);
    transaction.commit();
}

したがって、休止状態を構成する方法は問題ないと思います。エラーは、リスナーの追加に関係しています...

ここで何が間違っていますか?

4

2 に答える 2

4

Tomcat のソース コードを深く掘り下げた結果、考えられる解決策が 1 つ見つかりました。

rootCtx.addApplicationListener(new ApplicationListener("com.example.listeners.HibernateListener", false));

それは私が必要としていたことをします!

于 2014-01-02T11:49:05.787 に答える
0

初期化の直後に、configuraton c のメソッド cinfigure() の呼び出しが欠落していると思います。

したがって、次のようになります::

 SessionFactory sessionFactory =  getConfiguration().confgure().buildSessionFactory();

また

c = getConfiguration();
sessionFactory = c.configure().buildSessionFactory();

アップデート

実行時に完全なプロパティを追加するには、Prperties オブジェクトを作成して メソッドを使用します。

  configuration.buildSettings(Properties props)

よくわかりませんが、このアプローチを使用すると、休止状態がクラスパス内の hibernate.cfg.xml または .properties を検索しない可能性があります。

アップデート

HibernateUtil 明示的

public static getSessionFactory() {
    Configuration c = getConfiguration();
    sessionFactory = c.buildSessionFactory();
    return sessionFactory;
}
于 2014-01-02T00:04:57.690 に答える