アプリケーションの設定はDIコンテナであるSpringを使用します。とくにSpringにはHibernateと連携する機能があり、HibernateのDAOを作成するのにSpringを使うと非常に便利です。 Hibernate関連のSpringの設定ファイル †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のインタフェース †また、RSSテーブルにアクセスするDAOのインターフェースを以下のように定義します。 public interface RssDAO { public Rss findById(int id); public Rss[] findAll(); public void save(Rss rss); public void delete(Rss rss); } DAOの実装クラス †実装クラス(RssDAOImpl)は以下の通りです。ポイントとしては
としたいと思います。 /******************************************************************************* * 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" によって、
ということになります。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> これで、以下のように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."); } } この記事は 現在のアクセス:16025 |