使用Hibernate工具添加Hibernate搜索注释
我正在使用带注释的hibernate和带freemarker模板的hibernate工具来自动生成我的orm dao类 现在我想实现hibernate搜索,因此我想向这些类和属性添加hibernate搜索注释 但我不知道如何以及在何处配置希望hibernate工具注释的类和属性 freemarker模板的问题是,我通常只能为所有类定义类生成策略。但是对于hibernate搜索实现,我只想注释这些类中的特定类和特定属性 有没有办法定义我希望hibernate工具注释哪些类和getter属性?或者在构建过程之后自动注释类 到目前为止我可以排除的解决方案:使用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属性?或者在
- 在代码生成后手动添加注释->必须自动添加注释
- 在freemarker模板中使用几个if语句,比如“if class name==test do add@Index to class”->这将是一件非常麻烦的事情,尤其是在属性的注释中
- 添加一些设置到reveng.xml文件->至少我不知道这有什么帮助
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,但我相信它可能会帮助有类似问题的人。