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; } }