[Seasar-user:18371] Re: [S2JDBC-Gen] [CONTAINER-232] がデグレ?

Toshihiro Nakamura [E-MAIL ADDRESS DELETED]
2009年 8月 24日 (月) 12:21:22 JST


中村(taedium)です。

> 過去にあった修正したバグが再度発生している模様です。
> versionは1つ古い 2.4.38 ですが 2.4.39 のリリースノートを確認する限りあ
> りませんでしたので報告をします。

報告ありがとうございます。
idGenerationパラメータにassigned以外の値を指定した場合に
発生していました。
2.4.40で対応されます。


以下、2.4.38での対応方法を示します。

まず、AttributeModelFactoryImplを継承したクラスを作ってください。
getAttributeModelメソッドで、プロパティの型
Number型でなかったらGenerationTypeにnullを設定します。

public class MyAttributeModelFactory extends AttributeModelFactoryImpl {

    public MyAttributeModelFactory(boolean showColumnName,
            boolean showColumnDefinition, boolean useTemporalType,
            PersistenceConvention persistenceConvention) {
        super(showColumnName, showColumnDefinition, useTemporalType,
                persistenceConvention);
    }

    @Override
    public AttributeModel getAttributeModel(AttributeDesc attributeDesc) {
        AttributeModel model = super.getAttributeModel(attributeDesc);
        if (model.getGenerationType() != null) {
            Class<?> clazz = ClassUtil.getWrapperClassIfPrimitive(model
                    .getAttributeClass());
            if (!Number.class.isAssignableFrom(clazz)) {
                model.setGenerationType(null);
            }
        }
        return model;
    }
}

次に、FactoryImplを継承して、上記クラスのインスタンスを
EntityModelFactoryImplのコンストラクタに渡します。

public class MyFactory extends FactoryImpl {

    public EntityModelFactory createEntityModelFactory(Command command,
            String packageName, Class<?> superclass, boolean useTemporalType,
            boolean useAccessor, boolean useComment, boolean showCatalogName,
            boolean showSchemaName, boolean showTableName,
            boolean showColumnName, boolean showColumnDefinition,
            boolean showJoinColumn, PersistenceConvention persistenceConvention) {

        return new EntityModelFactoryImpl(packageName, superclass,
                new MyAttributeModelFactory(showColumnName,
                        showColumnDefinition, useTemporalType,
                        persistenceConvention),
                new AssociationModelFactoryImpl(showJoinColumn),
                new CompositeUniqueConstraintModelFactoryImpl(), useAccessor,
                useComment, showCatalogName, showSchemaName, showTableName);
    }
}

最後に、gen-entityタスクで、上記のクラスを指定してください。

  <gen-entity
    …
    factoryclassname="example.MyFactory"
  />
-- 
Toshihiro Nakamura



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