使用Hibernate工具添加Hibernate Search Annotations

时间:2012-09-25 13:29:44

标签: hibernate freemarker hibernate-annotations hibernate-search hibernate-tools

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

现在我想实现hibernate搜索,因此希望将hibernate搜索注释添加到这些类和属性中。

但我不知道如何以及在哪里可以配置哪些类和属性我希望hibernate工具进行注释。

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

有什么方法可以定义哪些类和getter属性我想通过hibernate工具注释?或者在构建过程之后自动注释类?

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

  • 在代码生成后手动添加注释 - >必须自动
  • 在freemarker模板中使用多个if语句,例如“if class name == test do add @Index to class” - >它只会很多,特别是对于属性的注释
  • 为reveng.xml文件添加一些设置 - >至少我不知道这有什么用呢

感谢您的帮助!

1 个答案:

答案 0 :(得分: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
}

同样,你可以为属性做到这一点。