【问题标题】:how to get ObjectNameNormalizer in hibernate 5如何在休眠 5 中获取 ObjectNameNormalizer
【发布时间】:2017-08-12 01:07:53
【问题描述】:

我正在尝试将我的休眠版本从 3 升级到 5.0。

您能否告知如何在休眠 5 中获取 ObjectNameNormalizer。我当前的代码仍在使用配置来检索会话工厂,由于我们在代码中动态设置属性,因此我无法更改它。

下面的代码需要在hibernate 5中重写-

Mappings mappings = c.createMappings(); (this method does not exist in 5.0)

props.put(TableGenerator.IDENTIFIER_NORMALIZER, mappings.getObjectNameNormalizer());

【问题讨论】:

    标签: hibernate hibernate-5.x


    【解决方案1】:

    试试这个解决方案。我们遇到了同样的问题。

    package test.hibernate.generator;
    
    import java.io.Serializable;
    import java.util.Properties;
    
    import org.hibernate.HibernateException;
    import org.hibernate.MappingException;
    import org.hibernate.boot.model.naming.ObjectNameNormalizer;
    import org.hibernate.boot.registry.StandardServiceRegistry;
    import org.hibernate.boot.spi.MetadataBuildingContext;
    import org.hibernate.engine.spi.SessionImplementor;
    import org.hibernate.id.Configurable;
    import org.hibernate.id.IdentityGenerator;
    import org.hibernate.id.enhanced.TableGenerator;
    import org.hibernate.service.ServiceRegistry;
    import org.hibernate.testing.boot.MetadataBuildingContextTestingImpl;
    import org.hibernate.type.LongType;
    import org.hibernate.type.Type;
    
    import hu.gov.nebih.cdv.CdvHelper;
    import hu.gov.nebih.domain.entity.BaseEntity;
    
    public class CustomIdGenerator extends IdentityGenerator implements Configurable {
        private CustomTableGenerator tableGenerator = new CustomTableGenerator();
        private ServiceRegistry serviceRegistry;
    
        @Override
        public Serializable generate(SessionImplementor session, Object obj) throws HibernateException {
            if (obj == null)
                throw new HibernateException(new NullPointerException());
    
            if (isIdNull(obj)) {
                return generateCustomId(session, obj);
            } else {
                return getUsedId(obj);
            }
        }
    
        private boolean isIdNull(Object obj) {
            return (obj instanceof BaseEntity && ((BaseEntity) obj).getId() == null);
        }
    
        private Serializable getUsedId(Object obj) {
            if (obj instanceof BaseEntity) {
                return ((BaseEntity) obj).getId();
            }
            return null;
        }
    
        private synchronized Serializable generateCustomId(SessionImplementor session, Object obj) {
            configureTableGenerator(session, tableGenerator);
    
            Long nextVal = (Long) tableGenerator.generate(session, obj);
    
            if (nextVal != null) {
                //any operation
            }
    
            return nextVal;
        }
    
        private CustomTableGenerator configureTableGenerator(SessionImplementor session, CustomTableGenerator tg) {
            if (tg.isConfigured()) {
                return tg;
            }
    
            final MetadataBuildingContext context = new MetadataBuildingContextTestingImpl((StandardServiceRegistry) serviceRegistry);
    
            ObjectNameNormalizer normalizer = new ObjectNameNormalizer() {
                @Override
                protected MetadataBuildingContext getBuildingContext() {
                    return context;
                }
            };
    
            Properties params = new Properties();
            params.put(TableGenerator.TABLE_PARAM, "custom_sequence");
            params.put(TableGenerator.VALUE_COLUMN_PARAM, "next_val");
            params.put(TableGenerator.INITIAL_PARAM, 7000000);
            params.put(TableGenerator.INCREMENT_PARAM, 1);
            params.put(TableGenerator.IDENTIFIER_NORMALIZER, normalizer);
            params.put(TableGenerator.SEGMENT_COLUMN_PARAM, "sequence_name");
            params.put(TableGenerator.SEGMENT_VALUE_PARAM, "value_param");
    
            tg.configure(new LongType(), params, session.getFactory().getServiceRegistry());
            tg.registerExportables(context.getMetadataCollector().getDatabase());
            tg.setConfigured(true);
    
            return tg;
        }
    
        @Override
        public void configure(Type type, Properties params, ServiceRegistry serviceRegistry) throws MappingException {
            this.serviceRegistry = serviceRegistry;
        }
    
        class CustomTableGenerator extends TableGenerator {
            private boolean configured = false;
    
            public boolean isConfigured() {
                return configured;
            }
    
            public void setConfigured(boolean configured) {
                this.configured = configured;
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      在线获取ObjectNameNormalizer 实例的大多数现有答案都是使用MetadataBuildingContextTestingImpl 获取MetadataBuildingContext。实际上,MetadataBuildingContextTestingImpl 类属于 'org.hibernate:hibernate-testing' 依赖项。测试范围 hibernate-testing 依赖项不是运行时类路径的候选对象。因此,添加了以下工作解决方案来实例化ObjectNameNormalizer,它只需要在您的类路径中使用'org.hibernate:hibernate-core'

              props.put(PersistentIdentifierGenerator.IDENTIFIER_NORMALIZER, new ObjectNameNormalizer() {
      
                  
                  @Override
                  protected MetadataBuildingContext getBuildingContext() {
                      StandardServiceRegistry serviceRegistry = sessionFactory.getSessionFactoryOptions().getServiceRegistry();
                      MetadataBuildingOptions buildingOptions = new MetadataBuilderImpl.MetadataBuildingOptionsImpl(serviceRegistry);
                      BootstrapContext bootstrapContext = new BootstrapContextImpl( serviceRegistry, buildingOptions );
                      InFlightMetadataCollector metadataCollector = new InFlightMetadataCollectorImpl( bootstrapContext, buildingOptions );
                      return new MetadataBuildingContextRootImpl(bootstrapContext, buildingOptions, metadataCollector);
                  }
              });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-10
        • 1970-01-01
        • 2014-12-20
        • 2018-10-19
        • 1970-01-01
        • 2011-05-01
        • 2019-05-16
        • 1970-01-01
        相关资源
        最近更新 更多