読者です 読者をやめる 読者になる 読者になる

プログラマとプロマネのあいだ

プログラマもやるし、プロマネもやるし、たまに似非アーキとか営業っぽいこともやる

S2DaoでEDAO0024が出る場合

なんでS2Dao?

次に参加するプロジェクトで使うかも知れなかったから。

しかしドキュメントが分かりづらい。。

S2Dao - S2Dao-Tigerリファレンスを読みつつやってたわけですが、
まずは動くところまでのクイックスタートがあって、その上で、詳細の説明があると良かったと思います。
動かすまでが簡単でないと、やる気が無くなります。。

本題

で、上のドキュメント通りにやってたら、以下のようなエラーに遭遇したという話。
エラーコード[EDAO0024]をググっても有用な情報がヒットしなかったので、残しておきます。

環境

エラーメッセージ

Exception in thread "main" org.seasar.framework.exception.SRuntimeException: [EDAO0024]永続化対象となるプロパティがありません。Employeeはテーブルと関連付いていない可能性があります。
	at org.seasar.dao.impl.InsertAutoDynamicCommand.createInsertPropertyTypes(InsertAutoDynamicCommand.java:110)
	at org.seasar.dao.impl.InsertAutoDynamicCommand.execute(InsertAutoDynamicCommand.java:58)
	at org.seasar.dao.interceptors.S2DaoInterceptor.invoke(S2DaoInterceptor.java:53)
	at org.seasar.dao.pager.PagerS2DaoInterceptorWrapper.invoke(PagerS2DaoInterceptorWrapper.java:71)
	at EmployeeDao$$EnhancedByS2AOP$$55c2671b$$MethodInvocation$$insert0.proceed(MethodInvocationClassGenerator.java)
	at EmployeeDao$$EnhancedByS2AOP$$55c2671b.insert(EmployeeDao$$EnhancedByS2AOP$$55c2671b.java)
	at Main.main(Main.java:31)

原因

DTOにpublicフィールドを使えるのは、Seasar2.4とS2Dao1.0.47以降の組み合わせのみ。
S2Dao 1.0.51に添付されているのは、Seasar2.3.23のため、DTOにpublicフィールドは使えない。

バージョン1.0.47から、Seasar2.4と組み合わせた場合に、カラムに対応したインスタンス変数をpublicフィールドとして宣言できるようになりました。 アクセッサが不要になるため、Beanの記述が簡単になります。

ダメな例(Employee.java
import org.seasar.dao.annotation.tiger.*;

@Bean(table="EMP")
public class Employee {
	public long empno;
	public String ename;
	public Short deptnum;
}
OKな例(Employee.java
import org.seasar.dao.annotation.tiger.*;

@Bean(table="EMP")
public class Employee {
	private long empno;
	private String ename;
	private Short deptnum;
	
	public long getEmpno() {
		return this.empno;
	}
	
	public void setEmpno(long empno) {
		this.empno = empno;
	}

	public String getEname() {
		return this.ename;
	}
	
	public void setEname(String ename) {
		this.ename = ename;
	}

	public Short getDeptnum() {
		return this.deptnum;
	}

	public void setDeptnum(Short deptnum) {
		this.deptnum = deptnum;
	}
}

当然のことながら

Seasar2.3.23を、Seasar2.4.45に差し替えることで(周辺ライブラリも)、ダメな例でも動作しました。