!!!技術的雑談-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で create を指定しているからです。 *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: 004: 005: 006: 007: 008: org.hsqldb.jdbcDriver 009: jdbc:hsqldb:data/test1_db 010: sa 011: 012: 013: 014: 1 015: 016: 017: org.hibernate.dialect.HSQLDialect 018: 019: 020: true 021: 022: 023: create 024: 025: 026: 027: 028: 029: 030: *1〜3行目 DTDという、XMLの書式を規定する宣言をしている。 EclipseのpluginのXMLBuddyとか使っていると入力をアシストしてくれたりします。 *5行目 Hibernateの設定を開始することを表す。 *6行目 SessionFactoryの設定を開始することを表す。 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行目 で実際のどのClassがマッピングするべきClassなのかを指定しています。 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}} [[技術的雑談]]へ戻る