#topicpath
----
//ここにコンテンツを記述します。
#contents


アプリケーションの設定はDIコンテナであるSpringを使用します。とくにSpringにはHibernateと連携する機能があり、HibernateのDAOを作成するのにSpringを使うと非常に便利です。


*** Hibernate関連のSpringの設定ファイル [#ba2b2963]
hibernate-spring.xmlという名前で、Hibernate関連のSpringの設定ファイルを作成します。内容は以下の通りです。
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
    "http://www.springframework.org/dtd/spring-beans.dtd">
 <beans>
   <!-- WEBコンテナのDataSourceを使う設定 -->
   <bean id="dataSource" 
     class="org.springframework.jndi.JndiObjectFactoryBean">
     <property name="jndiName">
       <value>java:comp/env/jdbc/MySqlDS</value>
     </property>
   </bean>
   
   <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
     <property name="dataSource">
       <ref local="dataSource" />
     </property>
     <property name="configLocation">
       <value>/WEB-INF/hibernate.cfg.xml</value>
       <!-- Mappingクラスだけhibernate.cfg.xmlに書く  -->
     </property>
     <property name="configurationClass">
       <value>org.hibernate.cfg.AnnotationConfiguration</value>
     </property>
   </bean>
 </beans>

ちなみに、hibernate.cfg.xmlは以下のようにしました。基本的にマッピングクラスの指定だけが書いてあります。
 <?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>
     <mapping class="nu.mine.kino.rss.hibernate.Rss" />
   </session-factory>
 </hibernate-configuration>


***DAOのインタフェース [#kce75adc]
また、[[RSSテーブル>Java/Pingアプリケーション/すでに打ったPing情報を格納するテーブルを作る]]にアクセスするDAOのインターフェースを以下のように定義します。

 public interface RssDAO {
     public Rss findById(int id);
     public Rss[] findAll();
     public void save(Rss rss);
     public void delete(Rss rss);
 }

***DAOの実装クラス [#bd19596f]
実装クラス([[RssDAOImpl:http://www.masatom.in/document/pingweb/j2h/nu/mine/kino/rss/dao/RssDAOImpl.java.html]])は以下の通りです。ポイントとしては
-Springが提供してくれる[[HibernateDaoSupport:http://www.springframework.org/docs/api/org/springframework/orm/hibernate/support/HibernateDaoSupport.html]] を拡張する
-[[HibernateDaoSupport:http://www.springframework.org/docs/api/org/springframework/orm/hibernate/support/HibernateDaoSupport.html]]のフィールドには先のhibernate-spring.xmlからInjectionする
-DAOImpl自体のSpringの設定ファイルは、設定をソースコードに書いてXDocletで自動生成する

としたいと思います。

 /*******************************************************************************
  * Copyright (c) 2005 Masatomi KINO.
  * All rights reserved. 
  * $Id: RssDAOImpl.java,v 1.2 2006/02/23 17:30:19 cvsuser Exp $
  *******************************************************************************/
 //作成日: 2005/10/30
 package nu.mine.kino.rss.dao;
 
 import java.util.List;
 import nu.mine.kino.rss.hibernate.Rss;
 import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
 
 /**
  * @author Masatomi KINO
  * @version $Revision: 1.2 $
  * @spring.bean id = "rssDao"
  * @spring.property name = "sessionFactory" ref = "sessionFactory"
  */
 public class RssDAOImpl extends HibernateDaoSupport implements RssDAO {
   public Rss findById(int id) {
     return (Rss) getHibernateTemplate().get(Rss.class, new Integer(id));
   }
   public Rss[] findAll() {
     List list = getHibernateTemplate().loadAll(Rss.class);
     return (Rss[]) list.toArray(new Rss[list.size()]);
   }
   public void save(Rss rss) {
     getHibernateTemplate().save(rss);
   }
   public void delete(Rss rss) {
     getHibernateTemplate().delete(rss);
   }
 }


クラスコメントの
 * @spring.bean id = "rssDao"
 * @spring.property name = "sessionFactory" ref = "sessionFactory"
によって、
-このクラスのidはrssDaoであること
-([[HibernateDaoSupport:http://www.springframework.org/docs/api/org/springframework/orm/hibernate/support/HibernateDaoSupport.html]]の)フィールド sessionFactory はhibernate-spring.xmlのsessionFactory がInjectionされること

ということになります。XDocletを通すことによってbean.xmlというSpringの設定ファイルが自動生成され、その中にこの@springによる情報も記述されます。自動生成されるbean.xmlは以下の通り:
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE beans PUBLIC
     "-//SPRING//DTD BEAN//EN"
     "http://www.springframework.org/dtd/spring-beans.dtd">
 <beans
   default-autowire="no"
   default-lazy-init="false"
   default-dependency-check="none"
 >
   <bean
       id="rssDao"
       class="nu.mine.kino.rss.dao.RssDAOImpl"
   >
     <property name="sessionFactory">
       <ref bean="sessionFactory"/>
     </property>
   </bean>
 </beans>

#ref(bean.png)

#ref(EA4.png)

これで、以下のようにRSSテーブルにアクセスすることができるようになりました。

 import nu.mine.kino.rss.dao.RssDAO;
 import nu.mine.kino.rss.hibernate.Rss;
 
 import org.apache.log4j.BasicConfigurator;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.support.ClassPathXmlApplicationContext;
 
 /**
  * @author Masatomi KINO
  * @version $Revision: 1.1 $
  */
 public class TestDAOMain {
   public static void main(String[] args) {
     BasicConfigurator.configure();
     System.out.println("Start.");
 
 
     ApplicationContext factory = new ClassPathXmlApplicationContext(
         new String[] { "hibernate-spring.xml", "beans.xml" });
     RssDAO rssDAO = (RssDAO) factory.getBean("rssDao");
     Rss[] rsss = rssDAO.findAll();
     for (Rss rss : rsss) {
       System.out.printf("%2d - %s%n", rss.getId(), rss.getTitle());
       System.out.println(rss);
     }
 
     System.out.println("End.");
 
   }
 }
 








----
この記事は
#vote(おもしろかった[8],そうでもない[3])
#vote(おもしろかった[9],そうでもない[3])

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS