hibernate - 独立模式导出 Hibernate Validator 集成
问题描述
如此处所述:
http://devmint.blogspot.com/2013/02/hibernate-schema-export-with-hibernate.html
SchemaExport 不再识别验证器特定的注释。
如何将方法“injectBeanValidationConstraintToDdlTranslator”翻译为 Hibernate 5.2?
配置文件不再存在,如此处所述:
Configuration.generateSchemaCreationScript() 在 Hibernate 5 中去了哪里
谢谢。
解决方案
我发现以下方法可以在 Hibernate 5.1 的模式导出期间实现对验证器属性的评估。
添加一个新的类CustomMetadataContributor:
package de.test;
import org.hibernate.MappingException;
import org.hibernate.boot.internal.ClassLoaderAccessImpl;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
import org.hibernate.boot.spi.ClassLoaderAccess;
import org.hibernate.boot.spi.InFlightMetadataCollector;
import org.hibernate.boot.spi.MetadataContributor;
import org.hibernate.cfg.SecondPass;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.config.spi.ConfigurationService;
import org.hibernate.engine.jdbc.spi.JdbcServices;
import org.jboss.jandex.IndexView;
import javax.validation.Validation;
import javax.validation.ValidatorFactory;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Map;
public class CustomMetadataContributor implements MetadataContributor {
public void contribute(InFlightMetadataCollector metadataCollector, IndexView jandexIndex){
metadataCollector.addSecondPass(new SecondPass() {
@Override
public void doSecondPass(final Map persistentClasses) throws MappingException {
try {
Method applyDDL = Class.forName("org.hibernate.cfg.beanvalidation.TypeSafeActivator") //
.getMethod("applyRelationalConstraints", ValidatorFactory.class, Collection.class, Map.class, Dialect.class, ClassLoaderAccess.class);
applyDDL.setAccessible(true);
StandardServiceRegistry serviceRegistry = metadataCollector.getMetadataBuildingOptions().getServiceRegistry();
applyDDL.invoke(null, Validation.buildDefaultValidatorFactory() ,metadataCollector.getEntityBindings(), serviceRegistry.getService( ConfigurationService.class ).getSettings(), serviceRegistry.getService( JdbcServices.class ).getDialect(),new ClassLoaderAccessImpl(serviceRegistry.getService( ClassLoaderService.class )));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
});
}
}
此外,您需要在路径中添加一个文本文件(没有文件扩展名)
META-INF/services/org.hibernate.boot.spi.MetadataContributor
包含
de.test.CustomMetadataContributor
而de.test需要替换为您的包名称。
推荐阅读
- javascript - (Javascript)如何将文件/一堆代码转换为变量?
- django - 如何避免俗名和姓氏的垂直重复?
- ios - SDK“iOS 14.3”中的产品类型“应用程序”需要代码签名
- tcl - TCL - 读取文件,额外行
- reactjs - 如何在引导程序 4.5.2 中重新加载页面时保留当前活动选项卡
- c# - 如何使用在 WPF 中没有依赖属性的类制作动画
- google-sheets - 如何在googlesheet中使用arrayformula来计算有条件的列?
- javascript - 无法使用 Formik & Yup 显示 FieldArrays 的错误
- android - 我正在使用改造 2.0。我想处理所有类型的网络错误和异常
- python - 如何将我的 JSON API 数据捆绑到一本字典中?