MyEclipseを使ってSSHに統合


Spring統合Hbernateの価値はSpringがHibernateであることにあります.以下の内容が追加されました.
*Session management:Springは、Hibernameのsessionに有効で、安全なコントロールを提供しています.Resource management:Springは、HibergeのSession Factores、JDBC datasourcesおよびその他の関連リソース*Integrated transaction magement:完全な事務管理*Exception wrapping:異常パッケージの包装
 
1.Spring IoC容器を利用してSession Factoryを作成する
 
org.springframe ebook.orm.hibernate 3.LocarSession FactoryBenを使用してSession Factoryを作成することができます.以下の2つの方法があります.
1)【最善の方案】Hibernateプロファイルhibernate.cfg.xmlを直接使用する.
Hibernateプロファイル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>
        <property name="myeclipse.connection.profile">
                com.microsoft.sqlserver.jdbc.SQLServerDriver
        </property>
        <property name="connection.url">
                jdbc:sqlserver://localhost:1433;databaseName=SSH
        </property>
        <property name="connection.username">sa</property>
        <property name="connection.password"></property>
        <property name="connection.driver_class">
                com.microsoft.sqlserver.jdbc.SQLServerDriver
        </property>
        <property name="dialect">
                org.hibernate.dialect.SQLServerDialect
        </property>
        <mapping resource="cn/qdqn/ssh/entity/UserInfo.hbm.xml" />
    </session-factory>
</hibernate-configuration>
 SpringプロファイルにおけるSession Factory初期化配置方法:
 
 
 
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="configLocation"
            value="classpath:hibernate.cfg.xml">
        </property>
</bean>

 
 
2)Springプロファイルにおいて、すべてのHibernate設定パラメータを統合する.
 
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" 
                          value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
        <property name="url" 
                          value="jdbc:sqlserver://localhost:1433;databaseName=SSH"/>
        <property name="username" value="sa"/>
        <property name="password" value=""/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource">
        </property>
        <property name="mappingResources">
            <list>
               <value>cn/qdqn/ssh/entity/UserInfo.hbm.xml</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">
                     org.hibernate.dialect.SQLServerDialect
                </prop>
                <prop key="show_sql">true</prop>
            </props>
        </property>
</bean>
 
注意:MyEclipseを使ってSSHを統合する場合、org.apphe.com mmons.dbcp.BaicDataSourceがあるカバンのcommons-dbcp-12.jarはデフォルトでローディングされません.また、comons-pool-1.4.jarをローディングする必要があります.両方ともApacheウェブサイトのcommonsプロジェクトで見つけられます.運転プログラムに以下の異常が発生します.
 
java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Unknown Source)
at java.lang.Class.getConstructor0(Unknown Source)
at java.lang.Class.getDeclaredConstructor(Unknown Source)
……
 2.Hbernate DAO開発
1)Hibernateを使用したAPIでDAOを実現します.
A.生APIを使ってDAOを実現する
 
public class UserInfoDAORaw implements IUserInfoDAO {
    private SessionFactory sessionFactory;
    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }
    public List findAll() {
        return this.sessionFactory.getCurrentSession()
                                                               .createQuery("from UserInfo").list();
    }
      ……
}
 
 
B.appication Contect.xmlに元のDAO Beanを配置する
 
<bean id="userInfoDAORaw" class="cn.qdqn.ssh.dao.UserInfoDAORaw">
        <property name="sessionFactory">
            <ref bean="sessionFactory" />
        </property>
</bean>
 C.運転テスト
 
 
 
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
UserInfoDAORaw dao=(UserInfoDAORaw)ctx.getBean("userInfoDAORaw");
List<UserInfo> list=dao.findAll();
for(UserInfo info : list){
        System.out.println(info.getUserName()+"-"+info.getUserPwd());
}
 
結論:Hibernate元のAPIを使ってDAOを実現することで、HibergとSpringを完全に分離することができます.
 
2)【最適案】Springフレームで提供されたHibernature Dao Support類を使ってDAOを実現します.
A.MyEclipse逆工程を用いてSpring統合HbernateのDAOを生成し、このDAOはSpringのorg.springframe ewark.orm.hibernate 3.support.Hbernate DaoSupportから継承します.
 
public class UserInfoDAO extends HibernateDaoSupport {
    private static final Log log = LogFactory.getLog(UserInfoDAO.class);
    // property constants
    public static final String USER_NAME = "userName";
    public static final String USER_PWD = "userPwd";

    public void save(UserInfo transientInstance) {
        log.debug("saving UserInfo instance");
        try {
            getHibernateTemplate().save(transientInstance);
            log.debug("save successful");
        } catch (RuntimeException re) {
            log.error("save failed", re);
            throw re;
        }
    }
      ……
}

 
 
 
 
B.appication Contect.xmlにDAO Beanを配置する
 
<bean id="userInfoDAO" class="cn.qdqn.ssh.dao.UserInfoDAO">
        <property name="sessionFactory">
            <ref bean="sessionFactory" />
        </property>
</bean>
 
C.運転テスト
 
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
UserInfoDAORaw dao = (UserInfoDAORaw)ctx.getBean("userInfoDAO");
List<UserInfo> list = dao.findAll();
for(UserInfo info : list) {
System.out.println(info.getUserName()+"-"+info.getUserPwd());
}
 注意:Hbernature DaoSupportはgetHbernature Template()方法でHbernate Templateのインスタンスを取得して保存、削除などの操作を行いますが、Hiberg Templateはデフォルトでは事務処理を行わず、Hybernateではこれらの操作は事務の下で実行しなければ正しい結果を得られないので、Spring声明式事務管理を使用しなければなりません.
 
 
3.Spring宣言式事務管理を使用する
 
1)Spring 1.xの事務代理類を用いて事務管理を行う
A.appication Contect.xmlに事務マネージャを宣言し、session Factory属性を注入する
 
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory">
            <ref local="sessionFactory" />
        </property>
</bean>
 
B.appication Contect.xmlでSpring AOP代理方式を使用して声明式事務を実現する.
 
<bean id="userInfoDAOProxy" class=
                                                        "org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <!--   true CGLIB       DAO  -->
        <property name="proxyTargetClass">
            <value>true</value>
        </property>
        <property name="transactionManager">
            <ref bean="transactionManager"/>
        </property>
        <property name="target">
            <ref bean="userInfoDAO"/>
        </property>
        <property name="transactionAttributes">
            <props>
                <prop key="*">PROPAGATION_REQUIRED</prop>
            </props>
        </property>
</bean>