cafegale(LeafCage備忘録)

LeafCage備忘録(はてなダイアリー)と統一しました。

S2JDBC覚書

サンプル(チュートリアル

Seasar2 - S2JDBC - チュートリアル

この時点では、コンパイルエラーが発生しますが問題ありません。 下で説明するエンティティの生成と修正を行うことでコンパイルエラーが解消されます。

エンティティのソースコードは、S2JDBC-Gen を使ってデータベース上のテーブル定義から自動生成します。 S2JDBC-Genの実行に必要なjarファイルとAntのビルドファイル(s2jdbc-gen-build.xml)はこのチュートリアルに含まれています。

プロジェクト直下にあるs2jdbc-gen-build.xmlに定義されたgen-entityターゲットを実行してください。 実行方法やその際の注意点については、Antタスクの実行 を参照してください。

とのことなので、antファイルを実行してみたがエラー

antファイルを修正しなければいけないらしい。

s2jdbc-gen-build.xml の1行目を

から

に修正してうまく行きました。

- R & J -: SAStrutsメモ書き
S2JDBCで詰まった。 - shinmのブログ


Doltengで自動作成されたAntファイルを実行するときには
事前に「H2」>「H2サーバの開始」を行っておくこと!!
また、コマンドラインで実行できる。

ant -f s2jdbc-gen-build.xml gen-entity

エンティティ

DBに永続化されるもの

アノテーション 対象 説明
@Entity クラス 「エンティティである。」エンティティクラスには必ず付与
@Table クラス マッピングするテーブルを指定。エンティティクラス名とテーブル名が異なるときに(略時のテーブル名はエンティティ名と同じに)
@MappedSuperclass クラス エンティティの親クラスに付与。なぜなら親クラスのフィールドはそのままでは永続化対象にならないから
@Column フィールド マッピングするカラムを指定する場合に付与。省略可
@Id フィールド 主キー
@GeneratedValue フィールド 主キーを自動生成させる*1
@Version フィールド 楽観的排他制御にしようするバージョンフィールドに付与
@Enumerated フィールド 列挙型フィールドに列挙型の扱いを指定する際に付与
@Temporal フィールド java.util.Date、java.util.Calendar型のフィールドに時制を指定するために付与*2 java.sql以下の型を使うときには必要ない 利用を推奨されていない
@Lob フィールド ラージオブジェクトとして扱うフィールド
@Basic フィールド デフォルトでDBからフェッチしないフィールド。ラージオブジェクトなど巨大なデータ用*3
@Transient フィールド 永続化対象外
@ManyToOne フィールド 多対一
@OneToMany フィールド 一対多。List型 @OneToMany(mappedBy="{相手側の、自分を参照しているフィールド名}")
@OneToOne フィールド 一対一。関連の被所有者側にはmappedBy属性が必要
@JoinColumn フィールド 関連の所有者側(外部キーを持っているテーブル)がjoinに使用するカラムを明示的に指定するとき*4

JdbcManager

jdbcManager.from({エンティティクラス})でAutoSelectが返される

where("{条件}", bind)のbind側の型をorg.seasar.extension.jdbc.parameter.Parameterのメソッドで扱いを変えられる

import static org.seasar.extension.jdbc.parameter.Parameter.*;
...
List<Employee> results = jdbcManager.from(Employee.class)
  .where("heredate = ?", date(heredate)
  .getResultList();
Parameterのmethod description
date(Calendar value) パラメータを日付として扱う
date(Date value) パラメータを日付として扱う
time(Calendar value) パラメータを時刻として扱う
time(Date value) パラメータを時刻として扱う
timestamp(Calendar value) パラメータを日時として扱う
timestamp(Date value) パラメータを日時として扱う
lob(byte[] value) パラメータをBLOBとして扱う
lob(Serializable value) パラメータをBLOBとして扱う
lob(String value) パラメータをBLOBとして扱う

検索結果

条件 id(Object... id), version(Object n), where(String c, Object... params), where(Where where), where(Where... where), where(Map c)
取得 getResultList(), getSingleResult(), GetCount()
制限 disallowNoResult(), maxRows(int maxRows), fetchSize(int fetchSize), queryTimeout(int queryTimeout)

jdbc.dicon

<!-- MySQLの場合 -->
	<component name="xaDataSource"
		class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
		<property name="driverClassName">
			"com.mysql.jdbc.Driver"
		</property>
		<property name="URL">
			"jdbc:mysql://localhost:3306/{DbName}"
		</property>
		<property name="user">"root"</property>
		<property name="password">"xxxx"</property>
	</component>

*1:strategy属性 GerenationType.AUTO GenerationType.IDENTITY GenerationType.SEQUENCE GenerationType.TABLE

*2:TemporalType.DATE(日付のみ), TemporalType.TIME(時刻のみ), TemporalType.TIMESTAMP(日付と時刻) 例:@Temporal(TemporalType.DATE)

*3:@Basic(fetch = FetchType.LAZY)を指定するとフェッチが行われない。fetchするには.eager("{フィールド名}")を使う

*4:@JoinCokumn(name="{所有者側のカラム名}", referencedColumnName="{被所有者側のカラム名}")