- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!!!技術的雑談-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}}
[[技術的雑談]]へ戻る