使用Hibernate工具添加Hibernate搜索注释

使用Hibernate工具添加Hibernate搜索注释,hibernate,freemarker,hibernate-annotations,hibernate-search,hibernate-tools,Hibernate,Freemarker,Hibernate Annotations,Hibernate Search,Hibernate Tools,我正在使用带注释的hibernate和带freemarker模板的hibernate工具来自动生成我的orm dao类 现在我想实现hibernate搜索,因此我想向这些类和属性添加hibernate搜索注释 但我不知道如何以及在何处配置希望hibernate工具注释的类和属性 freemarker模板的问题是,我通常只能为所有类定义类生成策略。但是对于hibernate搜索实现,我只想注释这些类中的特定类和特定属性 有没有办法定义我希望hibernate工具注释哪些类和getter属性?或者在

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

现在我想实现hibernate搜索,因此我想向这些类和属性添加hibernate搜索注释

但我不知道如何以及在何处配置希望hibernate工具注释的类和属性

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

有没有办法定义我希望hibernate工具注释哪些类和getter属性?或者在构建过程之后自动注释类

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

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

如何使用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
}
package${pojo.getPackageName()}.dao;
导入org.springframework.stereotype.Repository;
@存储库(${serviceId}.${declarationName}Dao)
//仅当searchAnnotationForClass为true时添加注释
@搜索(${serviceId})
公共类${declarationName}Dao{
//添加所有dao模板
}
同样,也可以对属性执行此操作

如何使用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
}
package${pojo.getPackageName()}.dao;
导入org.springframework.stereotype.Repository;
@存储库(${serviceId}.${declarationName}Dao)
//仅当searchAnnotationForClass为true时添加注释
@搜索(${serviceId})
公共类${declarationName}Dao{
//添加所有dao模板
}

类似地,您也可以对属性执行此操作。

工具仅用于生成初始正确映射,因为始终需要进行一些手动调整。您应该生成一次域,然后将其提交到源代码管理并手动管理。谢谢Sanne!我认为这样做可能更好。这些工具仅用于生成初始正确映射,因为一些手动调整总是必要的。您应该生成一次域,然后将其提交到源代码管理并手动管理。谢谢Sanne!我想这样做可能更好。谢谢@Sunil。虽然我不能测试你的解决方案,因为我不再与ftl合作了,但我相信它可能会帮助有类似问题的人。谢谢@Sunil。虽然我不能测试您的解决方案,因为我不再使用ftl,但我相信它可能会帮助有类似问题的人。