[Seasar-user:12364] Re: S2JDBCでエンティティクラスの継承をしたい

YASUO HIGA [E-MAIL ADDRESS DELETED]
2007年 12月 31日 (月) 09:21:26 JST


ひがです。

> 縣です。
> 
> S2JDBCのコードを確認したところ、
> エンティティクラスの対象となるフィールドはそのクラスのみで、
> 親クラスは対象としないようになっていました。
> 
エンティティの継承をサポートするとなると、
JPAの継承の仕様は、それなりに複雑でS2JDBC的には
Too muchかなと思っています。

後、今後のS2JDBCの拡張として、Entityのメタデータから
テーブル定義を更新する機能をつける予定があります。
そのときに、継承があるとカラムの順番をどうするのかが
微妙に難しくなります。

また、テーブル定義からEntityを自動生成する機能を作る場合でも
継承があると何かと厄介です。

ベースとなるエンティティは、カラムの定義のみとし、
メソッドや関連の定義を継承したエンティティに定義するということなら
上記の問題もおきにくいので、もう少し議論が必要かなと思っています。

とりあえずの対応なら、S2JDBCはほとんどのクラスを入れ替えできるように
なっているので、EntityMetaFactoryImplをカスタマイズしたクラスに
入れ替えるのが良いのではないでしょうか。
S2Tigerのjarに入っているs2jdbc-internal.diconを
src/main/resourcesにおいて、カスタマイズしてもらえれば
大丈夫です。

よろしくお願いします。

> 親クラスのフィールドも対象にするパッチを書いて見ましたので、
> 仕様の追加を検討して頂けると助かります。
> 
> AGATA Toshitaka さんは書きました:
> > 縣です。
> >
> > S2JDBCのエンティティクラスの継承について教えてください。
> >
> > ベースとなるエンティティを自動生成で作成して、
> > それを継承したクラスに関連などの定義を手動で行おうとしています。
> >
> > 以下のように継承したクラスをS2JDBCで使用すると例外が発生します。
> > フィールドなどを、Employeeに移動すると問題なく動作するので、
> > 親クラスのフィールドなどはS2JDBCでは認識されないという仕様なのかと
> > 思っていますが、このような場面で何かよい方法はありますか?
> >
> > ---------------------------------------------------------
> > @Entity
> > public class EmployeeBase { > @Id > @GeneratedValue(strategy =
> GenerationType.SEQUENCE) > public Integer id; > > public Integer
> departementId; > }
> >
> > @Entity
> > public class Employee extends EmployeeBase { > @ManyToOne > public
> Department department; > }
> > ---------------------------------------------------------
> >
> > ■エラーメッセージ
> > org.seasar.extension.jdbc.exception.ManyToOneFKNotFoundRuntimeException:
> > [ESSR0729]エンティティ(Employee)のプロパティ(department)が不正です。
> > JoinColumnのnameで指定されている外部キー(DEPARTMENT_ID)が存在しません。
> > at
> >
> org.seasar.extension.jdbc.meta.EntityMetaFactoryImpl.resolveJoinColumn
(EntityMetaFactoryImpl.java:306)
> > at
> >
> org.seasar.extension.jdbc.meta.EntityMetaFactoryImpl.resolveRelationship
(EntityMetaFactoryImpl.java:246)
> > at
> >
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main
(RemoteTestRunner.java:196)
> >
> >
> 
> 
> 
> ------------------------------------------------------------------------------
--
> 
> *** /Users/agata/Documents/workspace/from/EntityMetaFactoryImpl.java	2007-
12-29 16:38:14.000000000 +0900
> --- /Users/agata/Documents/workspace/to/EntityMetaFactoryImpl.java	2007-
12-29 16:53:09.000000000 +0900
> ***************
> *** 16,21 ****
> --- 16,22 ----
>   package org.seasar.extension.jdbc.meta;
>   
>   import java.lang.reflect.Field;
> + import java.util.ArrayList;
>   import java.util.LinkedHashMap;
>   import java.util.List;
>   import java.util.concurrent.ConcurrentHashMap;
> ***************
> *** 40,45 ****
> --- 41,47 ----
>   import org.seasar.framework.container.annotation.tiger.BindingType;
>   import org.seasar.framework.container.annotation.tiger.InitMethod;
>   import org.seasar.framework.convention.PersistenceConvention;
> + import org.seasar.framework.unit.S2FrameworkTestCase;
>   import org.seasar.framework.util.ClassUtil;
>   import org.seasar.framework.util.Disposable;
>   import org.seasar.framework.util.DisposableUtil;
> ***************
> *** 205,211 ****
>        *            繧ィ繝ウ繝?繧」繝?繧」繧ッ繝ゥ繧ケ
>        */
>       protected void doPropertyMeta(EntityMeta entityMeta, Class<?> 
entityClass) {
> !     	Field[] fields = entityClass.getDeclaredFields();
>           for (Field f : fields) {
>               if (!ModifierUtil.isInstanceField(f)) {
>                   continue;
> --- 207,213 ----
>        *            繧ィ繝ウ繝?繧」繝?繧」繧ッ繝ゥ繧ケ
>        */
>       protected void doPropertyMeta(EntityMeta entityMeta, Class<?> 
entityClass) {
> !     	Field[] fields = getFields(entityClass);
>           for (Field f : fields) {
>               if (!ModifierUtil.isInstanceField(f)) {
>                   continue;
> ***************
> *** 215,221 ****
>                       f, entityMeta));
>           }
>       }
> ! 
>       /**
>        * 繧ォ繧ケ繧ソ繝槭う繧コ縺励∪縺吶??
>        * 
> --- 217,235 ----
>                       f, entityMeta));
>           }
>       }
> !     
> !     private static Field[] getFields(Class<?> entityClass) {
> !         LinkedHashMap<String, Field> fieldSet = new LinkedHashMap<String, 
Field>();
> !         for (Class<?> clazz = entityClass; clazz != null; clazz = 
clazz.getSuperclass()) {
> !             for (Field f : clazz.getDeclaredFields()) {
> !                 if (!fieldSet.containsKey(f.getName())) {
> !                     fieldSet.put(f.getName(), f);
> !                 }
> !             }
> !         }
> !         return fieldSet.values().toArray(new Field[fieldSet.size()]);
> !     }
> !     
>       /**
>        * 繧ォ繧ケ繧ソ繝槭う繧コ縺励∪縺吶??
>        * 
> 
> 
> ------------------------------------------------------------------------------
--
> 
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
> 


Seasar-user メーリングリストの案内