Hibernate

 ここで試した環境はWindowsXP Home Edition、 J2SE SDK 1.4.2_01、MySQL 4.0.20、MySQL Connector-J JDBC Driver 3.1alpha、Hibernate 2.1.6です。

  1. JavaとMySQLはインストール済みとします。 またJDBCドライバもダウンロードし、CLASSPATHを通しておきます。
  2. Hibernateのホームページから、 Hibernateをダウンロードして、適当な場所で展開します。
  3. 開発・実行時には、最低限次のJARファイルが必要なので、展開したディレクトリと、 その下のlibディレクトリから取り出して適切な場所へ配置し、CLASSPATHを通します。
    • hibernate2.jar
    • cglib-full-*.jar
    • commons-collections-*.jar
    • commons-logging-*.jar
    • dom4j-*.jar
    • encache-*.jar
    • jdbc2_0-stdext.jar
    • jta.jar
    • odmg-3.0.jar
    また、Hibernateはたくさんのログメッセージを出力しますが、 これを制御するため、ロギング機構のライブラリJakarta Log4Jも使うと便利です。 そうするには、上記のエントリにlog4j-1.2.8.jarも加えます。
  4. Hibernateの設定ファイル、hibernate.cfg.xmlを書きます。 このファイルはCLASSPATHが通った場所に置くと自動的に検索されます。

    <?xml version="1.0" ?>
    <!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd" >
    <hibernate-configuration>
    <session-factory>
      <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
      <property name="connection.url">jdbc:mysql://localhost:3306/udb</property>
      <property name="connection.username">urano</property>
      <property name="connection.password">xyzyzx</property>
      <property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
      <property name="show_sql">true</property>
      <property name="use_outer_join">true</property>
      <mapping resource="shiten1.hbm.xml"/>
    </session-factory>
    </hibernate-configuration>
    

  5. マッピング設定ファイルを書きます。このファイル名はhibernate.cfg.xmlに書いた名前に合わせます。

    <?xml version="1.0" ?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
    <hibernate-mapping>
      <class name="hn1.Shiten" table="SHITEN">
        <id name="shitenCode" column="SHITEN_CODE" type="string"><generator class="assigned" /></id>
        <property name="shitenName"  type="string" column="SHITEN_NAME" />
        <property name="areaCode"    type="int"    column="AREA_CODE" />
        <property name="address"     type="string" column="ADDRESS" />
        <property name="employeeNum" type="int"    column="EMPLOYEE_NUM" />
      </class>
    </hibernate-mapping>
    

  6. Log4Jの設定ファイル、log4j.propertiesです。これもCLASSPATHの通った場所に置きます。

    ### direct log messages to stdout ###
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target=System.out
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    #log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
    log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
    
    ### direct messages to file hibernate.log ###
    #log4j.appender.file=org.apache.log4j.FileAppender
    #log4j.appender.file.File=hibernate.log
    #log4j.appender.file.layout=org.apache.log4j.PatternLayout
    #log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
    
    ### set log levels - for more verbose logging change 'info' to 'debug' ###
    
    #log4j.rootLogger=warn, stdout
    log4j.rootCategory=warn, stdout
    
    log4j.logger.net.sf.hibernate=info
    #log4j.logger.net.sf.hibernate=warn
    #log4j.category.net.sf.hibernate=debug
    
    ### log just the SQL
    #log4j.logger.net.sf.hibernate.SQL=debug
    
    ### log JDBC bind parameters ###
    #log4j.logger.net.sf.hibernate.type=info
    #log4j.logger.net.sf.hibernate.type=warn
    
    ### log schema export/update ###
    #log4j.logger.net.sf.hibernate.tool.hbm2ddl=debug
    #log4j.logger.net.sf.hibernate.tool.hbm2ddl=info
    
    ### log cache activity ###
    #log4j.logger.net.sf.hibernate.cache=debug
    
    ### enable the following line if you want to track down connection ###
    ### leakages when using DriverManagerConnectionProvider ###
    #log4j.logger.net.sf.hibernate.connection.DriverManagerConnectionProvider=trace
    

  7. エンティティを表すBeanクラスです。 この例で使う「Shiten」は、5つのプロパティと、それら各々のgetter/setterだけからなります。

    /*
     * Created on 2004/08/28
     */
    package hn1;
    import java.io.Serializable;
    
    public class Shiten implements Serializable {
        private String shitenCode;
        private String shitenName;
        private Integer areaCode;
        private String address;
        private Integer employeeNum;
    
        /**
         * @return Returns the address.
         */
        public String getAddress() {
            return address;
        }
    
        /**
         * @param address
         *            The address to set.
         */
        public void setAddress(String address) {
            this.address = address;
        }
    
        /**
         * @return Returns the areaCode.
         */
        public Integer getAreaCode() {
            return areaCode;
        }
    
        /**
         * @param areaCode
         *            The areaCode to set.
         */
        public void setAreaCode(Integer areaCode) {
            this.areaCode = areaCode;
        }
    
        /**
         * @return Returns the employeeNum.
         */
        public Integer getEmployeeNum() {
            return employeeNum;
        }
    
        /**
         * @param employeeNum
         *            The employeeNum to set.
         */
        public void setEmployeeNum(Integer employeeNum) {
            this.employeeNum = employeeNum;
        }
    
        /**
         * @return Returns the shitenCode.
         */
        public String getShitenCode() {
            return shitenCode;
        }
    
        /**
         * @param shitenCode
         *            The shitenCode to set.
         */
        public void setShitenCode(String shitenCode) {
            this.shitenCode = shitenCode;
        }
    
        /**
         * @return Returns the shitenName.
         */
        public String getShitenName() {
            return shitenName;
        }
    
        /**
         * @param shitenName
         *            The shitenName to set.
         */
        public void setShitenName(String shitenName) {
            this.shitenName = shitenName;
        }
    }
    

  8. 実際に検索を行うサンプルです。このサンプルは、テーブルSHITENの全件検索を行い、 結果集合をエンティティShitenのリストとして返します。

    /*
     * Created on 2004/08/28
     * 全件検索をするサンプル
     */
    package hn1;
    import java.util.List;
    import net.sf.hibernate.HibernateException;
    import net.sf.hibernate.Session;
    import net.sf.hibernate.SessionFactory;
    import net.sf.hibernate.cfg.Configuration;
    
    public class SelectTestApp1 {
        public static void main(String[] args) throws HibernateException {
            Configuration config = new Configuration();
            // XMLファイルにCLASSPATHが通っていればファイル名の指定は不要
            config = config.configure();
            //config = config.configure(new java.io.File("./conf/hibernate.cfg.xml"));
    
            SessionFactory sessionfactory = config.buildSessionFactory();
            Session session = sessionfactory.openSession();
    
            // 全件検索
            List list = session.createCriteria(Shiten.class).list();
    
            for (int i = 0; i < list.size(); i++) {
                Shiten e = (Shiten)list.get(i);
                System.out.println(e.getShitenCode() + ":" + e.getShitenName()); 
            }
        }
    }
    

  9. 次にプレースホルダー?を使って、絞込み検索を行うサンプルです。

    /*
     * Created on 2004/08/28
     * プレースホルダー?を使って条件検索をするサンプル
     */
    package hn1;
    import java.util.List;
    import java.util.Iterator;
    
    import net.sf.hibernate.HibernateException;
    import net.sf.hibernate.Query;
    import net.sf.hibernate.Session;
    import net.sf.hibernate.SessionFactory;
    import net.sf.hibernate.cfg.Configuration;
    
    public class SelectTestApp2a {
        public static void main(String[] args) throws HibernateException {
            Configuration config = new Configuration();
            config = config.configure();
    
            SessionFactory sessionfactory = config.buildSessionFactory();
            Session session = sessionfactory.openSession();
    
            // クエリーの文をFROMから始めると、オブジェクトのリストで返します。
            // SELECTで始めると、Object[]のリストで返します。
            // 次の2つは同じ意味です。
            Query q = session.createQuery("SELECT a FROM Shiten a WHERE a.shitenCode = ?");
            //Query q = session.createQuery("FROM Shiten a WHERE a.shitenCode = ?");
            q.setString(0, "00500");
            List list = q.list();
    
            for (int i = 0; i < list.size(); i++) {
                Shiten e = (Shiten)list.get(i);
                System.out.println(e.getShitenCode() + ":" + e.getShitenName()); 
            }
        }
    }
    

  10. 問合せをSELECTで開始し、どのエンティティにもマップされない問合せを行うと、 Object[]のリストで返されます。 Object[]の各要素が、各列のデータに対応しています。

    /*
     * Created on 2004/08/28
     * プレースホルダー?を使って条件検索をするサンプル
     */
    package hn1;
    import java.util.List;
    import java.util.Iterator;
    
    import net.sf.hibernate.HibernateException;
    import net.sf.hibernate.Query;
    import net.sf.hibernate.Session;
    import net.sf.hibernate.SessionFactory;
    import net.sf.hibernate.cfg.Configuration;
    
    public class SelectTestApp2b {
        public static void main(String[] args) throws HibernateException {
            Configuration config = new Configuration();
            config = config.configure();
    
            SessionFactory sessionfactory = config.buildSessionFactory();
            Session session = sessionfactory.openSession();
    
            // 表には必ず別名を指定する必要があり、全ての列に別名をつける必要があります。
            // つけないとnet.sf.hibernate.QueryException: undefined alias:
            // という例外が発生します。
            Query q = session.createQuery(
                    "SELECT a.shitenName, a.address FROM Shiten a WHERE a.shitenCode = ?");
            q.setString(0, "00300");
            Iterator iter = q.iterate();
            while (iter.hasNext() ) {
                Object[] row = (Object[]) iter.next();
                String shitenName = (String) row[0];
                String address = (String) row[1];
                System.out.println("[" + shitenName + "] [" + address + "]");
            }
        }
    }
    

JDBC and Swing Top

(first uploaded 2004/08/29 last updated (not ever), URANO398)

Gポイントポイ活 Amazon Yahoo 楽天

無料ホームページ 楽天モバイル[UNLIMITが今なら1円] 海外格安航空券 海外旅行保険が無料!