はじめに
SessionFactoryは、O/RマッパーでEntityを取得するために必要になります。
(Entity操作を行うDaoは、すべてSessionFactoryをベースとして実装されています。他にEntityManagerを使う方法がありますが、ここではSessionFactoryにフォーカスしてお伝えしたいと思います。)
そのSessionFactoryをサーバー起動時に取得しておこうというのが今回の趣旨となります。
Dao使用時に毎回SessionFactoryを生成してしまうと、Daoを作成した分だけSessionFactory生成処理が必要になってきます。
その分、余分な処理が必要になってくるというわけです。
サーバ起動時に1度、SessionFactoryを生成しておけば、そのSessionFactoryを使い回すことで、余分な処理が必要なくなります!
ServletContextListenerの作成
ServletContextListenerを作成して、サーバ起動時にSessionFactoryをServletContextに保存する処理を追加します。
- ServletContextListenerをインプリメントしてサーブレットコンテキストを取得しています。
- hibernate.cfg.xmlから設定内容を読み込んでいます。
- 設定内容からセッションファクトリーを取得しています。
- サーブレットコンテキストにセッションファクトリーを保存しています。
package com.pom2019.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
public class HibernateListener implements ServletContextListener {
private SessionFactory sessionFactory;
public static final String KEY_NAME = HibernateListener.class.getName();
@Override
public void contextDestroyed(ServletContextEvent arg0) {
if (sessionFactory != null) {
sessionFactory.close();
}
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
try {
//configures settings from hibernate.cfg.xml
Configuration configuration = new Configuration().configure();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties());
SessionFactory sessionFactory = configuration.buildSessionFactory(builder.build());
//save the Hibernate session factory into serlvet context
arg0.getServletContext().setAttribute(KEY_NAME, sessionFactory);
//ログの出力
if (sessionFactory != null) {
System.out.println("セッションファクトリーを取得できました!");
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
※SessionFactoryが取得できた場合は、ログ出力を行っています。(コメントの「ログの出力」部分)
HibernateListenerをリスナー登録
web.xmlでHibernateListenerをリスナー登録して、サーバ起動時にHibernateListenerを呼び出すようにしています。
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="struts_blank" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Struts Blank Convention</display-name>
<listener>
<listener-class>com.pom2019.Struts2Web.InitListener</listener-class>
</listener>
<listener>
<listener-class>com.pom2019.listener.HibernateListener</listener-class>
</listener>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
実行結果
サーバを再起動して、SessionFactoryを取得できているか確認します。
8 10, 2019 5:30:03 午後 org.apache.catalina.startup.Catalina load
情報: Initialization processed in 2959 ms
セッションファクトリーを取得できました!
8 10, 2019 5:30:10 午後 org.apache.catalina.startup.Catalina start
情報: Server startup in 6482 ms
無事、SessionFactoryを取得できていることが確認できました!
まとめ
SessionFactoryをServletContextに保存しておけば、いつでもSevletContextからSessionFactoryを取得することができます。
Dao操作を頻繁に行う、もしくはコードをシンプルにしたいなどといった場合に有効なので、よかったら活用して下さいね。
最後までお読み頂きありがとうございました。
コメントを残す