【问题标题】:Add Hibernate Search Annotations with Hibernate tools使用 Hibernate 工具添加 Hibernate Search Annotations
【发布时间】:2012-09-25 13:29:43
【问题描述】:

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

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

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

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

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

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

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

感谢您的帮助!

【问题讨论】:

  • 这些工具仅用于生成初始正确映射,因为始终需要进行一些手动调整。您应该生成一次域,然后将其提交到源代码管理并手动管理它。
  • 谢谢桑恩!我认为这样做可能会更好。

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


【解决方案1】:

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

似乎没有办法告诉hibernate执行这个添加自定义注释的任务。但是你可以用一些代码来做。

您应该扩展 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
}

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

【讨论】:

  • 谢谢@Sunil。虽然我无法测试您的解决方案,因为我不再使用 ftl,但我相信它可以帮助遇到类似问题的人。
猜你喜欢
  • 2010-12-10
  • 2012-06-10
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
  • 2015-04-19
  • 1970-01-01
相关资源
最近更新 更多