Автономная экспортная схема интеграции Hibernate Validator - PullRequest
0 голосов
/ 05 сентября 2018

как объяснено здесь:

http://devmint.blogspot.com/2013/02/hibernate-schema-export-with-hibernate.html

аннотации для валидатора больше не распознаются SchemaExport.

Как преобразовать метод "injectBeanValidationConstraintToDdlTranslator" в Hibernate 5.2?

Файл конфигурации больше не существует, как указано здесь:

Куда перешли Configuration.generateSchemaCreationScript () в Hibernate 5

Спасибо.

1 Ответ

0 голосов
/ 08 октября 2018

Я нашел следующий способ добиться оценки свойств валидатора во время экспорта схемы для 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 / услуги / org.hibernate.boot.spi.MetadataContributor

, содержащий

de.test.CustomMetadataContributor

, тогда как de.test необходимо заменить именем вашего пакета.

...