Hbernature 3.x格納プロセスを呼び出します.


原文の出所:http://tech.it168.com/j/d/2007-05-14/200705141007843.shtml
要約:本明細書では、詳細な例では、ヒベルナツ3.xにおいて、記憶プロセスを呼び出す各ステップが示されており、テストテーブルの確立、記憶プロセスの確立、工事の確立、およびクラスの作成およびテストから、ヒベルナツ3.xにおいて記憶プロセスを呼び出す方法をユーザに学習させるために導かれている.
下のデータベース(eg.Oracle、mysql、sqlserver)などが格納プロセスをサポートしている場合、格納プロセスによって一括削除、更新などの操作が実行されます.ここでは、記憶プロセスをどのように起動するかを例に挙げて説明する.
  説明:この例のhibernateのバージョンは3.0で、mysqlのバージョンは5.0で、データベースドライバはmysql-connector-java-5.4-bin.jarです.
一.             建設表と初期化データ
mysqlのtestデータベースに新しい表を作成します.user、建表文は以下の通りです.

 DROP TABLE IF EXISTS `user`;

CREATE TABLE `tbl_user` (

  `userid` varchar(50) NOT NULL,

  `name` varchar(50) default '',

  `blog` varchar(50) default '',

  PRIMARY KEY (`userid`)

) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
建表が成功したら、この表に次の4つの初期データを挿入します.対応するsql文は以下の通りです.
INSERT INTO `tbl_user` (`userid`,`name`,`blog`) VALUES ('ant', '  ', 'http://www.blogjava.net/qixiangnj');

INSERT INTO `tbl_user` (`userid`,`name`,`blog`) VALUES ('beansoft', 'bean', 'http://www.blogjava.net/beansoft');

INSERT INTO `tbl_user` (`userid`,`name`,`blog`) VALUES ('sterning', '    ', 'http://www.blogjava.net/sterning');

INSERT INTO `tbl_user` (`userid`,`name`,`blog`) VALUES ('tom', 'tom' , 'http://www.blogjava.net/tom');
二.             ストレージの作成
hibernate 3.xに格納されているプロセスの呼び出しをテストするために、私たちはuserテーブルにgetUserList、createUser、udateUser、deleteUserの4つの記憶プロセスを確立し、mysqlに格納プロセスを構築する文は以下の通りである.
1.ユーザ情報リストを取得する格納プロセス--getsUserList
DROP PROCEDURE IF EXISTS `getUserList`;

CREATE PROCEDURE `getUserList`()

begin

     select * from tbl_user;

end;
2.着信パラメータによってユーザーの記憶プロセスを作成する--createUser
DROP PROCEDURE IF EXISTS `createUser`;

CREATE PROCEDURE `createUser`(IN userid varchar(50), IN name varchar(50), IN blog varchar(50))

begin

    insert into tbl_user values(userid, name, blog);

end;
3.入ってきたパラメータでユーザー情報の保存プロセスを更新する.
DROP PROCEDURE IF EXISTS `updateUser`;

CREATE PROCEDURE `updateUser`(IN nameValue varchar(50), IN blogValue varchar(50), IN useidValue varchar(50))

begin

    update tbl_user set name = nameValue, blog = blogValue where userid = useridValue;

end;
4.ユーザ情報の保存プロセスを削除する--deleteUser
DROP PROCEDURE IF EXISTS `deleteUser`;

CREATE PROCEDURE `deleteUser`(IN useridValue int(11))

begin

    delete from tbl_user where userid = useridValue;

end;
三.             プログラミング前の準備作業
1.    建設工事
コード作成に入る前に、新しいjavaプロジェクトprocを作成します.ディレクトリ構造は以下の通りです.
proc
   -lib
    -ビン
    -src
      -com
        -アミーゴ
          -proc
            -モデル
2.    必要な包みを取り入れる
   hibernature 3.0のカバンとその関連カバンをコンパイルパスに入れます.また、mysqlのデータベースドライバjarパッケージmysql-connector-java-5.0.4-bin.jarをコンパイルパスに入れてください.
四.             コーディングとテスト
準備作業が完了したら、符号化とテスト段階に進み、本例ではヒベルナ3.0でmysqlの格納プロセスを呼び出す方法を実証した.
1、hibernateの配置ファイル
hibernateのプロファイルには、データベースの接続情報とOR mappingのxmlフォーマットのマッピングファイルが含まれています.このファイルは以下の通りです.
……

        <property name="connection.url">jdbc:mysql://localhost:3306/test</property>

        <property name="connection.username">root</property>

        <property name="connection.password">root</property>

        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>

        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <property name="show_sql">true</property>

        <mapping resource="com/amigo/proc/model/User.hbm.xml"/> 
    ……
2、OR Mappingファイル
生成されたOR MappingファイルにはUser.javaとその対応するhibernateマッピングファイルUser.hbm.xmlがあります.User.javaの内容は以下の通りです.
package com.amigo.proc.model;

 

/** *//**

 *       

 */

public class User implements java.io.Serializable {

    private static final long serialVersionUID = 1L;

    /** *//**   id*/

    private String userid;

    /** *//**     */

    private String name;

    /** *//**   blog*/

    private String blog;

//  get/set  

}
User.hbm.xmlファイルの内容は以下の通りです.
<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

 

<hibernate-mapping package="com.amigo.proc.model">

    <class name="User" table="tbl_user">

        <id name="userid" column="userid">

            <generator class="assigned"/>

        </id>

        <property name="name" column="name" type="string" />

        <property name="blog" column="blog" type="string" />

    </class>

    

    <sql-query name="getUserList" callable="true">

        <return alias="user" class="User">

            <return-property name="userid" column="userid"/>

            <return-property name="name" column="name"/>

            <return-property name="blog" column="blog" />

        </return>

        {call getUserList()}

    </sql-query>

</hibernate-mapping>
このファイルではのこのコードに注意して、呼び出しの記憶プロセスを定義し、記憶プロセスを呼び出してUserオブジェクトに記録を組み立てるとともに、記録のフィールドとオブジェクトの属性をマッピングします.
3.    hibernateのsession及び事務を管理する類Hbernature Session Factory
このクラスは、Sessionを開くなどの方法を含み、主にヒベルナのセッションと事務を管理する.このクラスの内容は以下の通りです.
package com.amigo.proc;

import java.io.ByteArrayOutputStream;

import java.io.OutputStreamWriter;

 

import org.hibernate.HibernateException;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;

import org.hibernate.cfg.Configuration;

/** *//**

 * Hibernate    

 */

public class HibernateSessionFactory {

    /** *//** Hibernate     */

    private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";

 

    /** *//**        session   */

    private static final ThreadLocal threadLocal = new ThreadLocal();

 

    /** *//** Hibernate          */

    private static Configuration configuration = null;

 

    /** *//** Hibernate SessionFactory      */

    private static SessionFactory sessionFactory;

 

    /** *//** Hibernate      */

    private static String charSet;

    /** *//**  Hibernate         ,        */

    private static final String encoding = (new OutputStreamWriter(

            new ByteArrayOutputStream())).getEncoding();

 

    /** *//**

     *       

     */

    public HibernateSessionFactory() {

    }

 

    /** *//**

     *   Hibernate      

     */

    public static final synchronized void open() {

        if (sessionFactory != null)

            return;

        try {

            sessionFactory = getConfiguration().buildSessionFactory();

            charSet = configuration.getProperty("hibernate.connection.charSet");

            if (charSet == null)

                charSet = encoding;

            return;

        } catch (Throwable throwable) {

            throw new ExceptionInInitializerError(throwable);

        }

    }

 

    /** *//**

     *   Hibernate   ,     

     */

    private static synchronized void configure() throws HibernateException {

        if (sessionFactory == null) {

            if (configuration == null) {

                getConfiguration().configure(CONFIG_FILE_LOCATION);

            }

            open();

        }

    }

 

    /** *//**

     *       

     */

    public static synchronized final Configuration getConfiguration() {

        if (configuration == null) {

            configuration = new Configuration();

        }

        return configuration;

    }

 

    /** *//**

     *     :  SessionFactory

     */

    public static final SessionFactory getSessionFactory() {

        return sessionFactory;

    }

 

    /** *//**

     *     :  session

     */

    public static final Session getSession() throws HibernateException {

        configure();

        Session session = null;

        if (threadLocal.get() == null) {

            session = getSessionFactory().openSession();

            threadLocal.set(session);

        } else {

            try {

                session = (Session)threadLocal.get();

            } catch(Exception ex) {

                session = getSessionFactory().openSession();

                threadLocal.set(session);

            }

        }

        return session;

    }

    //     

}

4.hibernate保存プロセスを呼び出すテストクラス
本クラスは、この例のコアクラスであり、このクラスでは、ヒベルナにおいてどのように記憶プロセスを起動するかを例示し、ヒベルナが照会、更新、挿入、および削除する4つの記憶プロセスを呼び出す方法を例示している.このような内容は以下の通りである.
package com.amigo.proc;

 

import java.sql.CallableStatement;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.util.List;

 

import com.amigo.proc.model.User;

 

import org.hibernate.Session;

import org.hibernate.Transaction;

 

/** *//**

 * hibernate      

 * @author Amigo Xie([email protected])

 * @since 2007/04/30

 */

public class ProcTest {

 

    /** *//**

     * @param args

     */

    public static void main(String[] args) throws Exception {

        ProcTest proc = new ProcTest();

        Session session = HibernateSessionFactory.getSession();

        proc.testProcQuery(session);

        proc.testProcUpdate(session);

        System.out.println("update successfully");

        

        proc.testProcInsert(session);

        System.out.println("insert successfully");

        

        proc.testProcDelete(session);

        System.out.println("delete successfully");

        session.close();

    }

    

    /** *//**

     *            

     * @throws Exception

     */

    private void testProcQuery(Session session) throws Exception {

        //      

        List list = session.getNamedQuery("getUserList").list();

        for (int i = 0; i < list.size(); i++) {

            User user = (User) list.get(i);    

            System.out.print("  : " + (i+1));

            System.out.print(", userid: " + user.getUserid());

            System.out.print(", name: " + user.getName());

            System.out.println(", blog: " + user.getBlog());

        }

    }

    

    /** *//**

     *            

     * @throws Exception

     */

    private void testProcUpdate(Session session) throws Exception {

        //      

        Transaction tx = session.beginTransaction(); 

        Connection con = session.connection(); 

        String procedure = "{call updateUser(?, ?, ?)}"; 

        CallableStatement cstmt = con.prepareCall(procedure); 

        cstmt.setString(1, " xx");

        cstmt.setString(2, "http://www.blogjava.net/sterningChen");

        cstmt.setString(3, "sterning");

        cstmt.executeUpdate(); 

        tx.commit();

    }

 

    /** *//**

     *            

     * @throws Exception

     */

    private void testProcInsert(Session session) throws Exception {

        //      

        session.beginTransaction();

        PreparedStatement st = session.connection().prepareStatement("{call createUser(?, ?, ?)}");

        st.setString(1, "amigo");

        st.setString(2, "   ");

        st.setString(3, "http://www.wblogjava.net/amigoxie");

        st.execute();

        session.getTransaction().commit(); 

    }

    

    /** *//**

     *            

     * @throws Exception

     */

    private void testProcDelete(Session session) throws Exception {

        //      

        session.beginTransaction();

        PreparedStatement st = session.connection().prepareStatement("{call deleteUser(?)}");

        st.setString(1, "amigo");

        st.execute();

        session.getTransaction().commit();

    }

}
   このクラスでは、クエリークラスの格納プロセスを呼び出したときに、session.get NamedQuery(「...」)方法を呼び出してUser.hbm.xmlに設定されているクエリー格納プロセスを取得します.残りの記憶プロセス呼び出しのテストでは、まず、ヒベルナのセッションによってconnectionを取得し、その後、connectionオブジェクトの対応する方法を呼び出して、記憶プロセスの呼び出しを実現する.
このクラスの実行結果は以下の通りです.
Hibernate:{call getUserList}
番号:1、userid:ant、name:アリ、ブログ:http://www.blogjava.net/qixiangnj
番号:2、userid:beansoft、name:bean、ブログ:http://www.blogjava.net/beansoft
番号:3、userid:sterning、name:水流年、ブログ:http://www.blogjava.net/sterning
番号:4、userid:tom、name:tom、ブログ:http://www.blogjava.net/tom
udate success fully
insert success fully
delete success fully
五.まとめ
   本例では、ヒベルナツ3でmysqlを呼び出す格納プロセスの実現形態を提案し、ヒベルナは、*.hbm.xmlに格納プロセスを設定し、session.getNamedQuery(「...」)方法をユーザに提供することにより、設定されたクエリに関する記憶プロセスを呼び出す方法を提供していることが分かる.これにより、connectionにおいてプロセスを格納することによって関連する方法を呼び出すことによって、記憶プロセスの呼び出しを実現することができる.