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 |
取得 | 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="{被所有者側のカラム名}")