1

注釈付きの休止状態とフリーマーカー テンプレート付きの休止状態ツールを使用して、orm dao クラスを自動的に生成しています。

今、休止状態の検索を実装したいので、これらのクラスとプロパティに休止状態の検索注釈を追加したいと考えています。

しかし、休止状態ツールに注釈を付けるクラスとプロパティをどこでどのように構成できるかわかりません。

freemarker テンプレートの問題は、すべてのクラスに対して一般的にクラス生成戦略しか定義できないことです。しかし、休止状態の検索の実装では、特定のクラスとこれらのクラス内の特定の属性のみに注釈を付けたいと考えています。

休止状態ツールで注釈を付けたいクラスとゲッター プロパティを定義する方法はありますか? または、ビルド プロセス後に自動的にクラスに注釈を付けますか?

これまでに除外できた解決策:

  • コード生成後に手動で注釈を追加 -> 自動的に行う必要があります
  • "if class name == test do add @Index to class" のような freemarker テンプレートでのいくつかの if ステートメントの使用 -> 特にプロパティの注釈を使用すると、多すぎます。
  • reveng.xml ファイルにいくつかの設定を追加します -> 少なくともこれがどのように役立つかわかりません

ご協力いただきありがとうございます!

4

1 に答える 1

1

Hibernate ツール タスクを使用して、DAO 生成でクラスとプロパティに Hibernate 検索注釈を追加する方法。

カスタム注釈を追加するためにこのタスクを実行するように hibernate に指示する方法はないようですが、いくつかのコードで実行できます。

hibernate POJOExporter クラスを拡張し、拡張されたクラスで、すべてのキーと値を additionalContext に追加する必要があります。これらのキーと値は、ftl ファイルで使用できます。ftl では、これらのキーと値の小道具に基づいて注釈を追加する決定を下すことができます。これが拡張pojoエクスポーターです

public class JavaDAOExporter extends PojoExporter {

    private static final String JAVA_DAO_FTL = "templates/hibernate/java/dao.ftl";
    private String serviceId;

    public JavaDAOExporter() {
        super();
    }

    public JavaDAOExporter(Configuration cfg, File outputdir, String serviceId, MetaDataDialect metadataDialect) {
        super(cfg, outputdir, metadataDialect);
        this.serviceId = serviceId;
    }

    protected void init() {
        super.init();
        setTemplateName(JAVA_DAO_FTL);
        setFilePattern("{package-name}/dao/{class-name}Dao.java");
    }
    @Override
    protected void exportPersistentClass(Map additionalContext, POJOClass element) {
        //Element is the pojo class,here you can take decision to add annotation in the class,if so add your key&value attributes.Which will be used in ftls.
        additionalContext.put("searchAnnotationForClass", true);
        exportPOJO(additionalContext, element);
    }

    public String getName() {
        return "hbm2javadao";
    }

    protected void exportComponent(Map additionalContext, POJOClass element) {
        // noop - we dont want components
    }

}

そして、テンプレートは次のようになりました

package ${pojo.getPackageName()}.dao;

<#assign classbody>
<#assign declarationName = pojo.importType(pojo.getDeclarationName())>
import org.springframework.stereotype.Repository;

@Repository("${serviceId}.${declarationName}Dao")
//Adding annotation only if searchAnnotationForClass is true
<#if true = searchAnnotationForClass>
@Search("${serviceId})
</#if>
public class ${declarationName}Dao{
//add all your dao template
}

同様に、プロパティに対しても実行できます。

于 2015-07-14T13:16:33.043 に答える