[Seasar-user:21134] Re: [s2jdbc-gen] 同一テーブル上でリレーションされる場合に例外となる。

Toshihiro Nakamura [E-MAIL ADDRESS DELETED]
2011年 11月 9日 (水) 21:28:34 JST


中村(taedium)です。
修正案ありがとうございます。次のバージョンで対応したいと思います。
とりあえずの回避策ですが、2つの方法が思い浮かびます。
まず1つ目ですが、byte[]型への対応を自前で組み込む方法があります。次のようなクラスを作ってgen-entitytestタスクのfactoryClassNameパラメータに登録してください。
--------------------------------------------------public class
MyFactory extends FactoryImpl {
  @Override  public EntityTestModelFactory
createEntityTestModelFactory(Command command,      String configPath,
String jdbcManagerName,      String testClassNameSuffix,
NamesModelFactory namesModelFactory,      boolean useNamesClass,
boolean useS2junit4) {
    return new EntityTestModelFactoryImpl(configPath, jdbcManagerName,
       testClassNameSuffix, namesModelFactory, useNamesClass,
useS2junit4) {
      @Override      protected String getExpression(Class<?>
propertyClass) {        if (propertyClass.isArray()            &&
propertyClass.getComponentType() == byte.class) {          return "new
byte[0]";        }        return super.getExpression(propertyClass);
   }    };  }}--------------------------------------------------
次に2つ目ですが、byte[]型の@Idをもつエンティティクラスのみを無視する方法です(そのようなエンティティクラスがごく少数でないと許容できないかもしれませんが...)。gen-entitytestタスクのignoreEntityClassNamePatternパラメータで対象外としたいエンティティクラスを指定できます。
どちらの方法であってもパラメータの説明についてはドキュメントを参照ください。http://s2container.seasar.org/2.4/ja/s2jdbc_gen/tasks/gen_entitytest.html#トップレベルのパラメータ
2011年11月9日18:19 Hideaki Numasawa <[E-MAIL ADDRESS DELETED]>:
> numasawaです。
>
> EntityTestModelFactoryImpl#getExpression(Class<?>) に
>
> if (clazz.isArray() && clazz.getComponentType() == byte.class) {
>
>        return "new byte[0]";
> }
>
> で対応できるとおもいます。
>
>
> 2011年11月9日17:41 Hideaki Numasawa <[E-MAIL ADDRESS DELETED]>:
>> numasawaです。
>>
>> s2jdbc-gen-build.xml の <target name="gen-entity">  を実行した際のもので
>> Entity クラスは自作していません。
>>
>> gen-entity にて作成されたEntityは確かに @Id public byte[] id; のような型になっています。
>>
>> http://s2container.seasar.org/2.4/ja/s2jdbc_gen/tasks/gen_entity.html
>>
>> の対応表を見るとサポートされていないとオカシイと思われます。
>>
>>
>> 2011年11月9日17:25 Toshihiro Nakamura <[E-MAIL ADDRESS DELETED]>:
>>> 中村(taedium)です。
>>>
>>> 例外は、次のように@Idを不正なプロパティ型に
>>> 注釈しているために発生しているのだと思われます。
>>>
>>>  @Id
>>>  public Hoge id;
>>>
>>> この例ではHoge型が不正です。
>>>
>>> gen-entitytestタスクは、@Idの注釈対象のプロパティ型として
>>> 次の型のみをサポートしています。
>>> ・boolean
>>> ・char
>>> ・byte
>>> ・short
>>> ・int
>>> ・long
>>> ・float
>>> ・double
>>> ・Boolean
>>> ・Character
>>> ・Byte
>>> ・Short
>>> ・Integer
>>> ・Long
>>> ・Float
>>> ・Double
>>> ・java.lang.String
>>> ・java.math.BigDecimal
>>> ・java.math.BigInteger
>>> ・java.util.Date
>>> ・java.util.Calendar
>>> ・java.sql.Date
>>> ・java.sql.Time
>>> ・java.sql.Timestamp
>>>
>>>> numasawaです。
>>>>
>>>> s2jdbc-gen にて同一テーブル上でリレーションされているテーブルが存在する場合
>>>> gen-entitytestタスクで以下の例外が発生します。
>>>>
>>>> gen-entitytestタスクを実行しなければ正常に終了します。
>>>>
>>>> s2jdbc-gen-build.xml はDolteng にて自動生成したもの。
>>>>
>>>> 環境
>>>> windows XP sp3
>>>> java    6.0
>>>> Eclipse 3.7
>>>> dolteng 0.41
>>>>
>>>> 以上よろしくお願いします。
>>>>
>>>> ----------- 以下スタック
>>>> --------------------------------------------------------------
>>>> [gen-entitytest] Java Result: 1
>>>>
>>>> BUILD FAILED
>>>> C:\skyp\kouji\model-s2jdbc\s2jdbc-gen-build.xml:96: Exception in
>>>> thread "main" org.seasar.extension.jdbc.gen.exception.CommandFailedRuntimeException:
>>>> [ES2JDBCGen0005]コマンド(org.seasar.extension.jdbc.gen.internal.command.GenerateEntityTestCommand)の実行に失敗しました。バージョンは
>>>> S2JDBC-Gen 2.4.43 です。理由はjava.lang.IllegalArgumentException:
>>>> propertyClass
>>>>       at org.seasar.extension.jdbc.gen.internal.command.AbstractCommand.execute(AbstractCommand.java:164)
>>>>       at org.seasar.extension.jdbc.gen.internal.command.CommandInvokerImpl.invoke(CommandInvokerImpl.java:29)
>>>>       at org.seasar.extension.jdbc.gen.command.CommandAdapter.main(CommandAdapter.java:61)
>>>> Caused by: java.lang.IllegalArgumentException: propertyClass
>>>>       at org.seasar.extension.jdbc.gen.internal.model.EntityTestModelFactoryImpl.getExpression(EntityTestModelFactoryImpl.java:205)
>>>>       at org.seasar.extension.jdbc.gen.internal.model.EntityTestModelFactoryImpl.doIdValue(EntityTestModelFactoryImpl.java:142)
>>>>       at org.seasar.extension.jdbc.gen.internal.model.EntityTestModelFactoryImpl.getEntityTestModel(EntityTestModelFactoryImpl.java:122)
>>>>       at org.seasar.extension.jdbc.gen.internal.command.GenerateEntityTestCommand.generateTest(GenerateEntityTestCommand.java:454)
>>>>       at org.seasar.extension.jdbc.gen.internal.command.GenerateEntityTestCommand.doExecute(GenerateEntityTestCommand.java:439)
>>>>       at org.seasar.extension.jdbc.gen.internal.command.AbstractCommand.execute(AbstractCommand.java:162)
>>>>       ... 2 more
>>>>
>>>> Total time: 27 seconds
>>>> _______________________________________________
>>>> Seasar-user mailing list
>>>> [E-MAIL ADDRESS DELETED]
>>>> https://ml.seasar.org/mailman/listinfo/seasar-user
>>>
>>> --
>>> Toshihiro Nakamura <[E-MAIL ADDRESS DELETED]>
>>>
>>> _______________________________________________
>>> Seasar-user mailing list
>>> [E-MAIL ADDRESS DELETED]
>>> https://ml.seasar.org/mailman/listinfo/seasar-user
>>>
>>
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>



-- 
Toshihiro Nakamura


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