1

我正在使用带有注释的休眠和带有 freemarker 模板的休眠工具来自动生成我的 orm dao 类。

现在我想实现休眠搜索,因此想为这些类和属性添加休眠搜索注释。

但我不知道如何以及在哪里可以配置我希望休眠工具注释的类和属性。

freemarker 模板的问题是,我只能为所有类定义一般的类生成策略。但是对于休眠搜索实现,我只想注释特定的类和这些类中的特定属性。

有什么方法可以定义我希望通过休眠工具注释的类和 getter 属性?或者在构建过程之后自动注释类?

到目前为止我可以排除的解决方案:

  • 代码生成后手动添加注释->必须自动
  • 在 freemarker 模板中使用多个 if 语句,例如“if class name == test do add @Index to class”-> 太多了,尤其是属性的注释
  • 向 reveng.xml 文件添加一些设置 -> 至少我不知道这有什么帮助

谢谢你的帮助!

4

1 回答 1

1

如何使用 Hibernate 工具任务向 DAO 生成中的类和属性添加 Hibernate 搜索注释。

似乎没有办法告诉休眠执行此任务以添加自定义注释。但是您可以使用一些代码来完成。

您应该扩展休眠 POJOExporter 类,并在扩展类中,将所有键和值添加到附加上下文中。这些键和值将在您的 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 回答