トップ 一覧 検索 ヘルプ RSS ログイン

技術的雑談-Hibernate-Annotationsお試し1の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!技術的雑談-Hibernate-Annotationsお試し1

!!環境
*WindowsXP(sp2)
*JDK1.5.0_04
*Hibernate3.1bata3
*Hibernate-Annotations3.1bata5
*DBとしてHSQLDB-1.8.0.2を使用(他に使っているDBがあるならそれを使ってもOK。その場合はそのDB用のJDBCドライバーを用意しておくこと。)

!!目的
*Hibernate3.1 + Hibernate-AnnotationsでAnnotationを使ったHibernateのO/Rマッピングを試す。

!!メリット
*Mappingファイルをジャカジャカ書かなくてもマッピングができる!
*ソースコード内にO/Rマッピング情報を記述できるので設定箇所を減らせる(→メンテナンス性、可読性の向上)
*Eclipseなどのアノーテーション対応Editorの場合、要素を表示させながら開発できる。

!!注意事項
*Hibernate3.1、Hibernate-Annotations3.1はβ版状態ですので今後仕様が変わるかもしれません。
*ついでに、Hibernate-Annotationsが準拠しているJava Persistent APIもまだ策定中ですので変更される可能性があります。

!!セットアップ

ここではEclipseを使っていることを前提に話をしています。

!Projectの作成

+「Java Project」を作成し、/bin、/src、/libを用意します。
+この後に記述するjarを/libにコピーし、Projectのプロパティーのビルドパスのライブラリーで「.jarファイルの追加」をしてプロジェクト内のClass Pathに含めます。

!Hibernate3.1bata3のセットアップ

+[hibernate.org|http://www.hibernate.org]から対象ZIPファイルを落としてきます
+ZIP解凍先の/lib/README.txtの内容に従って必要なJarを/libから集めます。ちなみに今回は以下のようなjarで動きました。(全てが必要と言うわけではないと思いますが…。)
**ant-antlr-1.6.5.jar
**antlr-2.7.5H3.jar
**asm.jar
**asm-attrs.jar
**cglib-2.1.2.jar
**commons-collections-2.1.1.jar
**commons-logging-1.0.4.jar
**dom4j-1.6.1.jar
**ehcache-1.1.jar
**jdbc2_0-stdext.jar
**jta.jar
**junit-3.8.1.jar(もしかしたらいらない公算が高い…。)
**log4j-1.2.11.jar
**xml-apis.jar
**hibernate3.jar(※これだけZIP解凍ディレクトリのTopにあります。お忘れなく。)
+これらのファイルを、プロジェクトの/lib以下にコピーし、ビルドパスを通します。

!Hibernate-Annotationsのセットアップ

+[hibernate.org|http://www.hibernate.org]から対象ZIPファイルを落としてきます
+ZIP解凍先のトップにあるhibernate-annotations.jarと、/lib/ejb3-persistence.jarをプロジェクトの/lib以下にコピーします。
**hibernate-annotations.jar
**ejb3-persistence.jar
+これらのファイルにビルドパスを通します。

!HSQLDBのセットアップ

+[HSQLDBのHP|http://hsqldb.sourceforge.net/]から対象ZIPファイルを落としてきます。
+その中のhsqldb.jarをプロジェクトの/libにコピーし、ビルドパスを通します。

(HSQLDBは1つのjarがJDBCドライバーとDBエンジンを兼ねています。便利。)

!!コーディング

以下のファイルを用意します。

!Person.java 【マッピングされるClass】

このClassはJavaとDBとのデータのやり取りに使われます。
「このClassの1インスタンスがDBの1レコードにあたる」と思っていれば大体正解でしょう。

Java→DBも、DB→JavaもこのClassを仲立ちとしてデータのやり取りが行われます。

 package test;
 
 import java.io.Serializable;
 
 import javax.persistence.Basic;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.Id;
 
 /**
  *
  */
 @Entity
 public class Person implements Serializable {
     
     /**
      * 
      */
     private static final long serialVersionUID = 770763658257972418L;
     
     private String name;
     private int age;
     private String address;
     
     private long id;
     
     @Id
     public long getId() {
         return id;
     }
     
     public void setId(long id) {
         this.id = id;
     }
     
     @Basic
     public String getAddress() {
         return address;
     }
     
     public void setAddress(String address) {
         this.address = address;
     }
     
     @Basic
     public int getAge() {
         return age;
     }
     
     public void setAge(int age) {
         this.age = age;
     }
     
     @Basic(fetch = FetchType.LAZY)
     public String getName() {
         return name;
     }
     
     public void setName(String name) {
         this.name = name;
     }
         
 }

DBとのやり取りはこのClassのインスタンスを通して行われます。

::@Entity
:::このClassがDBに対してマッピングされることを示します。他に何も指定していないのでClass名がそのままTable名になります。java.io.Serializableをimplimentしている必要があります。
::@Id
:::このフィールド(getter/setterによってアクセスされる変数)がテーブル上でのPrimary Keyであることを示します。
:::@Idが付いているフィールドはテーブル内で値が重複しないようにする必要があります。
::@Basic
:::このフィールドがDBのColumn(列)にマッピングされていることを示します。
:::ここでは一切パラメータを省略しているのでColumn名はフィールド名とされます。
:::一箇所だけ「(fetch = FetchType.LAZY)」なんて書いてありますが、これはDB→フィールドの遅延(実際にこのフィールドが使用されるときにDBから引っ張られてくる)を指定しているものです。この程度のサンプルなら無くても問題ないはずですが……。それに確かHibernate3.0ぐらいから遅延割り当てがデフォルトになっていたような気が…。

!Main.java 【アプリケーションのメインルーチン】

アプリケーションとしてのメインルーチンです。
Hibernate、HSQLDBの初期化も行っています。

 001:/**
 002: * 
 003: */
 004:package test;
 005:
 006:import java.util.Iterator;
 007:
 008:import org.hibernate.Query;
 009:import org.hibernate.Session;
 010:import org.hibernate.SessionFactory;
 011:import org.hibernate.Transaction;
 012:import org.hibernate.cfg.AnnotationConfiguration;
 013:
 014:/**
 015: * @author Tsubasa
 016: *
 017: */
 018:public class Main {
 019:
 021:    /**
 022:     * @param args
 023:     */
 024:    public static void main(String[] args) {
 025:        
 026:        // Hibernate, Hibernate Annotations初期化
 027:        SessionFactory sessionFactory = null;
 028:        
 029:        try {
 030:            // *** ここでAnnotationを拾って処理しています。多分。 ***
 031:            sessionFactory = new AnnotationConfiguration().configure()
 032:                    .buildSessionFactory();
 033:        } catch (Throwable ex) {
 034:            // Log exception!
 035:            throw new ExceptionInInitializerError(ex);
 036:        }
 037:                
 038:        Session  session = sessionFactory.openSession();
 039:        
 040:        // 適当にObject作って登録する
 041:        Person[] pp = new Person[10];
 042:        for(int i = 0; i < 10; ++i) {
 043:            
 044:            // 登録するObjectを作成
 045:            pp[i] = new Person();
 046:            pp[i].setName("TARO[" + i + "]");
 047:            pp[i].setAddress("Yokohama");
 048:            pp[i].setAge(31 + i);
 049:            pp[i].setId(i);
 050:            
 051:            // トランザクション開始
 052:            Transaction tx = session.beginTransaction();
 053:            
 054:            // 登録
 055:            session.save(pp[i]);
 056:            
 057:            // コミット
 058:            tx.commit();
 059:        
 060:        }
 061:        
 062:        //---------------------------------------------------
 063:        
 064:        // 取り出し
 065:        Transaction tx2 = session.beginTransaction();
 066:        
 067:        // クエリー
 068:        Query query = session.createQuery("from Person");
 069:        
 070:        for(Iterator it = query.iterate(); it.hasNext();) {
 071:            Person ps = (Person)it.next();
 072:            System.out.println("Id : " + ps.getId());
 073:            System.out.println("Name : " + ps.getName());
 074:            System.out.println("Address : " + ps.getAddress());
 075:            System.out.println("Age : " + ps.getAge());
 076:        }
 077:        
 078:        tx2.commit();
 079:        
 080:        // 後始末
 081:        session.close();
 082:        sessionFactory.close();
 083:        
 084:
 085:
 086:    }
 087:
 088:}

解説:

*26〜36行目

Hibernateの初期化をHibernate-Annotationsを使って行っています。
エラー処理はいい加減です。(^^;

普通は
 〜 = new Configuration().configure()〜
と書いていると思いますが、Annotationsを使っている場合AnnotationConfiguration()を使うことによりAnnotationも含めて初期化がされます。

あ、ここで言う「初期化」とは「マッピング設定の取得」「スキーマ(Schema)の作成」の事です。
特に何にもしていないのにスキーマを作っている理由は下のhibernate.cfg.xmlで
 <property name="hbm2ddl.auto">create</property>
を指定しているからです。

*38行目

HibernateでのSessionをOpenしています。
ここで言う「Session」とはDatabase用語での「Session」とは意味が若干違っていて、どうも「アプリケーションでの1スレッド」とか「1カタマリの処理」という意味合いのようです。
 アプリケーションは1つのSessionFactoryを持っていて、
 SessionFactoryからは複数のSessionを持っていて、
 Sessionは1つのTransactionを持つ。
ということのようです。

多分Sessionは排他処理とかの単位なんでしょうね。多分。
まだ良く分かりません。

*41〜60行目

データを作成し、DBに登録しています。

Personに適当に違った値を入れながら10個のデータ(=レコード)を作成し、DBに登録しています。

手順的には、
+POJO(ここで言うPerson.javaのようにDBとのマッピングがされているClass)を作成(普通にnew)
+POJOにデータをセット
+Session.beginTransaction()する  ←トランザクション開始
+Session.save(オブジェクト)する  ←データ登録(Insert)
+Transaction.commit()する     ←コミット
の繰り返しです。

あ、別に1レコードごとにCommitしなくてもいいですけど。ここではキャッシュとか何にも設定していないので。

*65〜78行目

今登録したデータを読んでいます。

手順的には、
+Session.beginTransaction()する  (いや、読み出しにはトランザクションがいらないという説も有力)
+Session.createQuery("〜")する
**ここで"〜"にHQLと呼ばれるHibernate用クエリー言語を入れてDBを引かせる。意味的には「SELECT * FROM Person;」と同じ意味。つまり、Personテーブルの中身全部。
+上で得られたQueryオブジェクト(=Query結果)からIteratorやListで結果を取り出し、処理をする。取り出したものはPOJOのClass(ここではPerson)にキャストして使うこと。
+(ここでPOJOの内容を書き換えてUpdateなんかをやっちゃったりするのもOK)
+終わったらTransaction.commit()する  (Updateしなかったらなくてもいいという説もある。)

*81,82行目

後始末。

SessionとSessionFactoryをcloseする。
(直後にアプリケーションが終了しているのでなくても大丈夫と言うウワサはあるが…。お行儀良く。)


!hibernate.cfg.xml 【Hibernateの設定】

このファイルはClasspathで探せるところ(分からなければEclipseでのsrcディレクトリの直下)に置く。
Databaseとのコネクションとか、Schemaの作成を行うかなどの設定をする。

マッピングも本来はここで設定できるが、今回はAnnotationを使っているのでここでは行っていない。

 001:<!DOCTYPE hibernate-configuration PUBLIC
 002:	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 003:	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
 004:
 005:<hibernate-configuration>
 006:	<session-factory>
 007:	<!-- Database connection settings -->
 008:	<property name="connection.driver_class">org.hsqldb.jdbcDriver</property>
 009:	<property name="connection.url">jdbc:hsqldb:data/test1_db</property>
 010:	<property name="connection.username">sa</property>
 011:	<property name="connection.password"></property>
 012:	
 013:	<!-- JDBC connection pool (use the built-in) -->
 014:	<property name="connection.pool_size">1</property>
 015:	
 016:	<!-- SQL dialect -->
 017:	<property name="dialect">org.hibernate.dialect.HSQLDialect</property>
 018:	
 019:	<!-- Echo all executed SQL to stdout -->
 020:	<property name="show_sql">true</property>
 021:	
 022:	<!-- Drop and re-create the database schema on startup -->
 023:	<property name="hbm2ddl.auto">create</property>
 024:	
 025:	<!-- Mapping -->
 026:	<mapping package="test"/>
 027:	<mapping class="test.Person" />
 028:	
 029:	</session-factory>
 030:</hibernate-configuration>

*1〜3行目

DTDという、XMLの書式を規定する宣言をしている。

EclipseのpluginのXMLBuddyとか使っていると入力をアシストしてくれたりします。

*5行目

Hibernateの設定を開始することを表す<hibernate-configuration>。

*6行目

SessionFactoryの設定を開始することを表す<session-factory>。

SessionFactory内のPropertyの意味は大体以下の通り。
::connection.driver_class
:::DB接続に使うJDBC Driver Class。(ここではHSQLDBを指定。)
::connection.url
:::DB接続に使うURL。(ここでは、起動時のディレクトリにdataというディレクトリを掘って、そこにデータを保存しています。)
::connection.username
:::DB接続に使うDatabaseアカウント(HSQLDBではデフォルトで「sa」しかユーザがいない)
::connection.password
:::DB接続に使うDatabaseアカウントのパスワード(HSQLDBのsaはデフォルトでpasswordなし。)
::connection.pool_size
:::DB接続のプール個数(DB接続は時間が掛かるので、パフォーマンス向上の為にいくつかの接続をあらかじめ用意しておいて要求に応じて使いまわすことが一般的なみたいです。)
::dialect
:::接続DatabaseごとのSQLやドライバー挙動の「方言」を指定。実際に使用しているDBにあわせること。(Hibernateマニュアル参照)
::show_sql
:::trueに設定すると、HibernateがDBに対して吐いているSQL文を見せてくれる。
::hbm2ddl.auto
:::ここをcreateに設定すると、Java側での設定(hibernate.cfg.xmlの内容やhibernate-annotationで検出された設定)に基づいてDB側にテーブルを作成してくれる。トップダウン設計に向いている。逆にボトムアップ型の開発をするときは無効に設定しないと泣きを見る。

*26,27行目

<mapping>で実際のどのClassがマッピングするべきClassなのかを指定しています。
Classにアノーテーションが書いてあっても、ここに<mapping>が書いてなかったらマッピングされません。注意してください。

尚、<mapping package>と<mapping class>がありますが、packageを指定したからと言ってその下のclassでpackageを省略してもOK…って事ではないみたいです。
何で2つ指定しないとならないのかは謎。

!!実行

Eclipseで「Java Applicationの実行/Debug」を行うか、コンパイルしたClassに対してjavaコマンドで起動をかけます。

HSQLDBの場合はJDBC経由でいきなりアクセスをした場合、その場でそのデータベースを作ってくれると言ううれしい挙動をしてくれます。
もしMySQLやPostgreSQLなどを使う場合は、

+hibernate.cfg.xmlのconnection.driver_classをそれぞれのDBのJDBCドライバーのClassにし、実際のjarをClasspathに含める。
+テストプログラムの実行の前に以下のことを行ってデータベースを作成しておく。
++hibernate.cfg.xmlのconnection.urlに合う形でデータベースを作成しておく。(やりかたはそれぞれのDBの説明を参照。)
++または、hibernate.cfg.xmlのconnection.urlを使うDBの形式にあわせたものに変える。
++hibernate.cfg.xmlのconnection.username、passwordに合うDatabaseのユーザを作成する。
++作成したユーザで、connection.urlで指定したデータベースで「テーブル作成」「テーブル消去」「SELECT」「INSERT」のできる権限を用意する。

をやっておかないとダメです。

ちなみに、私のところではこんな感じでログが出てきます。

 13:05:10,322  INFO Environment:470 - Hibernate 3.1 beta 3
 13:05:10,332  INFO Environment:500 - hibernate.properties not found
 13:05:10,342  INFO Environment:516 - using CGLIB reflection optimizer
 13:05:10,352  INFO Environment:546 - using JDK 1.4 java.sql.Timestamp handling
 13:05:10,432  INFO Configuration:1239 - configuring from resource: /hibernate.cfg.xml
 13:05:10,432  INFO Configuration:1216 - Configuration resource: /hibernate.cfg.xml
 13:05:10,582  INFO AnnotationConfiguration:114 - Mapping package test
 13:05:10,642  WARN AnnotationBinder:157 - Package not found or wo package-info.java: test
 13:05:10,682  INFO Configuration:1350 - Configured SessionFactory: null
 13:05:10,682 DEBUG Configuration:1119 - Preparing to build session factory with filters : {}
 13:05:10,682 DEBUG AnnotationConfiguration:181 - Execute first pass mapping processing
 13:05:10,682 DEBUG AnnotationConfiguration:238 - Process hbm files
 13:05:10,682 DEBUG AnnotationConfiguration:246 - Process annotated classes
 13:05:10,702 DEBUG Ejb3Column:141 - Binding column TYPE unique false
 13:05:10,722 DEBUG EntityBinder:193 - Import with entity name=Person
 13:05:10,742 DEBUG AnnotationBinder:796 - Processing test.Person per property access
 13:05:10,773 DEBUG AnnotationBinder:859 - Processing annotations of test.Person.id
 13:05:10,773 DEBUG Ejb3Column:141 - Binding column id unique false
 13:05:10,773 DEBUG AnnotationBinder:967 - id is an id
 13:05:10,783 DEBUG SimpleValueBinder:183 - building SimpleValue for id
 13:05:10,783 DEBUG PropertyBinder:112 - Building property id
 13:05:10,783 DEBUG PropertyBinder:121 - Cascading id with null
 13:05:10,783 DEBUG AnnotationBinder:1007 - Bind @EmbeddedId on id
 13:05:10,783 DEBUG AnnotationBinder:859 - Processing annotations of test.Person.age
 13:05:10,783 DEBUG Ejb3Column:141 - Binding column age unique false
 13:05:10,783 DEBUG PropertyBinder:93 - binding property age with lazy=false
 13:05:10,793 DEBUG SimpleValueBinder:183 - building SimpleValue for age
 13:05:10,793 DEBUG PropertyBinder:112 - Building property age
 13:05:10,793 DEBUG PropertyBinder:121 - Cascading age with null
 13:05:10,793 DEBUG AnnotationBinder:859 - Processing annotations of test.Person.address
 13:05:10,793 DEBUG Ejb3Column:141 - Binding column address unique false
 13:05:10,793 DEBUG PropertyBinder:93 - binding property address with lazy=false
 13:05:10,793 DEBUG SimpleValueBinder:183 - building SimpleValue for address
 13:05:10,793 DEBUG PropertyBinder:112 - Building property address
 13:05:10,793 DEBUG PropertyBinder:121 - Cascading address with null
 13:05:10,793 DEBUG AnnotationBinder:859 - Processing annotations of test.Person.name
 13:05:10,793 DEBUG Ejb3Column:141 - Binding column name unique false
 13:05:10,793 DEBUG PropertyBinder:93 - binding property name with lazy=true
 13:05:10,803 DEBUG SimpleValueBinder:183 - building SimpleValue for name
 13:05:10,803 DEBUG PropertyBinder:112 - Building property name
 13:05:10,803 DEBUG PropertyBinder:121 - Cascading name with null
 13:05:10,813 DEBUG AnnotationConfiguration:208 - processing manytoone fk mappings
 13:05:10,813  INFO Configuration:996 - processing extends queue
 13:05:10,813  INFO Configuration:1000 - processing collection mappings
 13:05:10,813  INFO Configuration:1009 - processing association property references
 13:05:10,813  INFO Configuration:1031 - processing foreign key constraints
 13:05:10,903  INFO DriverManagerConnectionProvider:41 - Using Hibernate built-in connection pool (not for production use!)
 13:05:10,903  INFO DriverManagerConnectionProvider:42 - Hibernate connection pool size: 1
 13:05:10,903  INFO DriverManagerConnectionProvider:45 - autocommit mode: false
 13:05:10,903  INFO DriverManagerConnectionProvider:80 - using driver: org.hsqldb.jdbcDriver at URL: jdbc:hsqldb:data/test1_db
 13:05:10,903  INFO DriverManagerConnectionProvider:83 - connection properties: {user=sa, password=}
 13:05:10,903 DEBUG DriverManagerConnectionProvider:93 - total checked-out connections: 0
 13:05:10,903 DEBUG DriverManagerConnectionProvider:109 - opening new JDBC connection
 13:05:11,333 DEBUG DriverManagerConnectionProvider:115 - created connection to: jdbc:hsqldb:data/test1_db, Isolation Level: 0
 13:05:11,363  INFO SettingsFactory:77 - RDBMS: HSQL Database Engine, version: 1.8.0
 13:05:11,363  INFO SettingsFactory:78 - JDBC driver: HSQL Database Engine Driver, version: 1.8.0
 13:05:11,363 DEBUG DriverManagerConnectionProvider:129 - returning connection to pool, pool size: 1
 13:05:11,383  INFO Dialect:100 - Using dialect: org.hibernate.dialect.HSQLDialect
 13:05:11,393  INFO TransactionFactoryFactory:31 - Using default transaction strategy (direct JDBC transactions)
 13:05:11,403  INFO TransactionManagerLookupFactory:33 - No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)
 13:05:11,403  INFO SettingsFactory:125 - Automatic flush during beforeCompletion(): disabled
 13:05:11,403  INFO SettingsFactory:129 - Automatic session close at end of transaction: disabled
 13:05:11,403  INFO SettingsFactory:136 - JDBC batch size: 15
 13:05:11,403  INFO SettingsFactory:139 - JDBC batch updates for versioned data: disabled
 13:05:11,403  INFO SettingsFactory:144 - Scrollable result sets: enabled
 13:05:11,413  INFO SettingsFactory:152 - JDBC3 getGeneratedKeys(): disabled
 13:05:11,413  INFO SettingsFactory:160 - Connection release mode: null
 13:05:11,413  INFO SettingsFactory:187 - Default batch fetch size: 1
 13:05:11,413  INFO SettingsFactory:191 - Generate SQL with comments: disabled
 13:05:11,413  INFO SettingsFactory:195 - Order SQL updates by primary key: disabled
 13:05:11,413  INFO SettingsFactory:338 - Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory
 13:05:11,413  INFO ASTQueryTranslatorFactory:21 - Using ASTQueryTranslatorFactory
 13:05:11,413  INFO SettingsFactory:203 - Query language substitutions: {}
 13:05:11,423  INFO SettingsFactory:209 - Second-level cache: enabled
 13:05:11,423  INFO SettingsFactory:213 - Query cache: disabled
 13:05:11,423  INFO SettingsFactory:325 - Cache provider: org.hibernate.cache.EhCacheProvider
 13:05:11,433  INFO SettingsFactory:228 - Optimize cache for minimal puts: disabled
 13:05:11,433  INFO SettingsFactory:237 - Structured second-level cache entries: disabled
 13:05:11,443  INFO SettingsFactory:257 - Echoing all SQL to stdout
 13:05:11,443  INFO SettingsFactory:264 - Statistics: disabled
 13:05:11,443  INFO SettingsFactory:268 - Deleted entity synthetic identifier rollback: disabled
 13:05:11,443  INFO SettingsFactory:283 - Default entity-mode: POJO
 13:05:11,584  INFO SessionFactoryImpl:157 - building session factory
 13:05:11,584 DEBUG SessionFactoryImpl:168 - Session factory constructed with filter configurations : {}
 13:05:11,584 DEBUG SessionFactoryImpl:171 - instantiating session factory with properties: {java.runtime.name=Java(TM) 2 Runtime Environment, Standard Edition, hibernate.connection.password=, sun.boot.library.path=C:\jdk1.5.0_04\jre\bin, java.vm.version=1.5.0_04-b05, hibernate.connection.username=sa, java.vm.vendor=Sun Microsystems Inc., java.vendor.url=http://java.sun.com/, path.separator=;, java.vm.name=Java HotSpot(TM) Client VM, file.encoding.pkg=sun.io, user.country=JP, sun.os.patch.level=Service Pack 2, java.vm.specification.name=Java Virtual Machine Specification, user.dir=C:\sakamoto\workspace\Test2, java.runtime.version=1.5.0_04-b05, java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment, hbm2ddl.auto=create, java.endorsed.dirs=C:\jdk1.5.0_04\jre\lib\endorsed, os.arch=x86, java.io.tmpdir=C:\DOCUME~1\seki\LOCALS~1\Temp\, line.separator=
 , java.vm.specification.vendor=Sun Microsystems Inc., user.variant=, os.name=Windows XP, sun.jnu.encoding=MS932, java.library.path=C:\jdk1.5.0_04\bin;.;C:\WINDOWS\system32;C:\WINDOWS;C:\jdk1.5.0_04\bin;C:jdk1.5.0_04\jre\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;, java.specification.name=Java Platform API Specification, java.class.version=49.0, hibernate.connection.pool_size=1, sun.management.compiler=HotSpot Client Compiler, os.version=5.1, user.home=C:\Documents and Settings\seki, connection.password=, user.timezone=Asia/Tokyo, java.awt.printerjob=sun.awt.windows.WPrinterJob, connection.username=sa, java.specification.version=1.5, file.encoding=MS932, hibernate.connection.driver_class=org.hsqldb.jdbcDriver, show_sql=true, java.class.path=C:\sakamoto\workspace\Test2\bin;C:\sakamoto\workspace\Test2\lib-hibernate-annotations\hibernate-annotations.jar;C:\sakamoto\workspace\Test2\lib-hibernate-annotations\ejb3-persistence.jar;C:\sakamoto\workspace\Test2\lib-hibernate3.1\hibernate3.jar;C:\sakamoto\workspace\Test2\lib-hibernate3.1\ant-antlr-1.6.5.jar;C:\sakamoto\workspace\Test2\lib-hibernate3.1\asm.jar;C:\sakamoto\workspace\Test2\lib-hibernate3.1\asm-attrs.jar;C:\sakamoto\workspace\Test2\lib-hibernate3.1\cglib-2.1.2.jar;C:\sakamoto\workspace\Test2\lib-hibernate3.1\commons-collections-2.1.1.jar;C:\sakamoto\workspace\Test2\lib-hibernate3.1\commons-logging-1.0.4.jar;C:\sakamoto\workspace\Test2\lib-hibernate3.1\dom4j-1.6.1.jar;C:\sakamoto\workspace\Test2\lib-hibernate3.1\ehcache-1.1.jar;C:\sakamoto\workspace\Test2\lib-hibernate3.1\jdbc2_0-stdext.jar;C:\sakamoto\workspace\Test2\lib-hibernate3.1\jta.jar;C:\sakamoto\workspace\Test2\lib-hibernate3.1\junit-3.8.1.jar;C:\sakamoto\workspace\Test2\lib-hibernate3.1\log4j-1.2.11.jar;C:\sakamoto\workspace\Test2\lib-hibernate3.1\xml-apis.jar;C:\sakamoto\workspace\Test2\lib-hibernate3.1\antlr-2.7.5H3.jar;C:\sakamoto\workspace\Test2\lib-HSQLDB\hsqldb.jar, user.name=seki, hibernate.show_sql=true, java.vm.specification.version=1.0, sun.arch.data.model=32, java.home=C:\jdk1.5.0_04\jre, hibernate.connection.url=jdbc:hsqldb:data/test1_db, hibernate.dialect=org.hibernate.dialect.HSQLDialect, java.specification.vendor=Sun Microsystems Inc., user.language=ja, connection.pool_size=1, awt.toolkit=sun.awt.windows.WToolkit, java.vm.info=mixed mode, sharing, hibernate.cglib.use_reflection_optimizer=true, java.version=1.5.0_04, java.ext.dirs=C:\jdk1.5.0_04\jre\lib\ext, sun.boot.class.path=C:\jdk1.5.0_04\jre\lib\rt.jar;C:\jdk1.5.0_04\jre\lib\i18n.jar;C:\jdk1.5.0_04\jre\lib\sunrsasign.jar;C:\jdk1.5.0_04\jre\lib\jsse.jar;C:\jdk1.5.0_04\jre\lib\jce.jar;C:\jdk1.5.0_04\jre\lib\charsets.jar;C:\jdk1.5.0_04\jre\classes, java.vendor=Sun Microsystems Inc., file.separator=\, connection.driver_class=org.hsqldb.jdbcDriver, java.vendor.url.bug=http://java.sun.com/cgi-bin/bugreport.cgi, hibernate.hbm2ddl.auto=create, sun.cpu.endian=little, sun.io.unicode.encoding=UnicodeLittle, sun.desktop=windows, connection.url=jdbc:hsqldb:data/test1_db, sun.cpu.isalist=pentium_pro+mmx pentium_pro pentium+mmx pentium i486 i386 i86, dialect=org.hibernate.dialect.HSQLDialect}
 13:05:11,604  WARN Configurator:126 - No configuration found. Configuring ehcache from ehcache-failsafe.xml found in the classpath: jar:file:/C:/sakamoto/workspace/Test2/lib-hibernate3.1/ehcache-1.1.jar!/ehcache-failsafe.xml
 13:05:11,874 DEBUG AbstractEntityPersister:2437 - Static SQL for entity: test.Person
 13:05:11,874 DEBUG AbstractEntityPersister:2439 -  Version select: select id from Person where id =?
 13:05:11,874 DEBUG AbstractEntityPersister:2440 -  Snapshot select: select person_.id, person_.age as age0_, person_.address as address0_, person_.name as name0_ from Person person_ where person_.id=?
 13:05:11,874 DEBUG AbstractEntityPersister:2442 -  Insert 0: insert into Person (age, address, name, id) values (?, ?, ?, ?)
 13:05:11,874 DEBUG AbstractEntityPersister:2443 -  Update 0: update Person set age=?, address=?, name=? where id=?
 13:05:11,874 DEBUG AbstractEntityPersister:2444 -  Delete 0: delete from Person where id=?
 13:05:12,074  INFO SessionFactoryObjectFactory:82 - Not binding factory to JNDI, no JNDI name configured
 13:05:12,084  INFO Configuration:996 - processing extends queue
 13:05:12,084  INFO Configuration:1000 - processing collection mappings
 13:05:12,084  INFO Configuration:1009 - processing association property references
 13:05:12,084  INFO Configuration:1031 - processing foreign key constraints
 13:05:12,094  INFO Configuration:996 - processing extends queue
 13:05:12,094  INFO Configuration:1000 - processing collection mappings
 13:05:12,094  INFO Configuration:1009 - processing association property references
 13:05:12,094  INFO Configuration:1031 - processing foreign key constraints
 13:05:12,094  INFO SchemaExport:153 - Running hbm2ddl schema export
 13:05:12,094  INFO SchemaExport:180 - exporting generated schema to database
 13:05:12,094 DEBUG SchemaExport:283 - drop table Person if exists
 13:05:12,094 DEBUG SchemaExport:283 - create table Person (id bigint not null, age integer not null, address varchar(255), name varchar(255), primary key (id))
 13:05:12,094  INFO SchemaExport:200 - schema export complete
 13:05:12,104  INFO SessionFactoryImpl:432 - Checking 0 named queries
 Hibernate: insert into Person (age, address, name, id) values (?, ?, ?, ?)
 Hibernate: insert into Person (age, address, name, id) values (?, ?, ?, ?)
 Hibernate: insert into Person (age, address, name, id) values (?, ?, ?, ?)
 Hibernate: insert into Person (age, address, name, id) values (?, ?, ?, ?)
 Hibernate: insert into Person (age, address, name, id) values (?, ?, ?, ?)
 Hibernate: insert into Person (age, address, name, id) values (?, ?, ?, ?)
 Hibernate: insert into Person (age, address, name, id) values (?, ?, ?, ?)
 Hibernate: insert into Person (age, address, name, id) values (?, ?, ?, ?)
 Hibernate: insert into Person (age, address, name, id) values (?, ?, ?, ?)
 Hibernate: insert into Person (age, address, name, id) values (?, ?, ?, ?)
 Hibernate: select person0_.id as col_0_0_ from Person person0_
 Id : 0
 Name : TARO[0]
 Address : Yokohama
 Age : 31
 Id : 1
 Name : TARO[1]
 Address : Yokohama
 Age : 32
 Id : 2
 Name : TARO[2]
 Address : Yokohama
 Age : 33
 Id : 3
 Name : TARO[3]
 Address : Yokohama
 Age : 34
 Id : 4
 Name : TARO[4]
 Address : Yokohama
 Age : 35
 Id : 5
 Name : TARO[5]
 Address : Yokohama
 Age : 36
 Id : 6
 Name : TARO[6]
 Address : Yokohama
 Age : 37
 Id : 7
 Name : TARO[7]
 Address : Yokohama
 Age : 38
 Id : 8
 Name : TARO[8]
 Address : Yokohama
 Age : 39
 Id : 9
 Name : TARO[9]
 Address : Yokohama
 Age : 40
 13:05:12,936  INFO SessionFactoryImpl:859 - closing
 13:05:12,936  INFO DriverManagerConnectionProvider:147 - cleaning up connection pool: jdbc:hsqldb:data/test1_db

この次は「リレーション」もやってみたいですね。

!!オマケ

今回使用したソースとjarをEclipseのProject形式で固めたものです。
あ、ユーザーライブラリ使ってるので、アーカイブのトップにある.userlibrarisをインポートしないとダメです。
(全部強引にビルドパスに入れちゃっても良いけどね^^;)

{{ref Test2.zip}}

あ、文字コードがEUC-JPになっているので、プロジェクトのプロパティーの一番上の項目にある「テキストコードのエンコード」の項目を「EUC-JP」にしてください。

ちなみにただ実行させるだけなら問題ありません。
(そのまま編集したら文字化けしちゃうけどね。)
!!履歴
2005/09/22 -- 初版

[[技術的雑談]]へ戻る

!!突っ込み
{{comment}}

[[技術的雑談]]へ戻る

{{trackback}}

[[技術的雑談]]へ戻る