繁体   English   中英

Hibernate从4.3.x迁移到5.x,用于方法org.hibernate.cfg.Configuration.getClassMapping(className)

[英]Hibernate Migration from 4.3.x to 5.x for method org.hibernate.cfg.Configuration.getClassMapping(className)

在Hibernate 4.3.x中,有一个类org.hibernate.cfg.Configuration getClassMapping(className)方法。 但是在Hibernate 5.x中,这个getClassMapping(className)方法已从Configuration类中删除。

Hibernate-5中的代码替换是什么?

请帮助解决此迁移问题。

发布了Broadleaf Commerce,因为他们还需要PersistentClass

我一直在使用Hibernate 5,其中一些更改....现在使用Serviceloader来获取元数据:

package org.broadleafcommerce.openadmin.server.dao;

import org.hibernate.boot.SessionFactoryBuilder;
import org.hibernate.boot.spi.MetadataImplementor;
import org.hibernate.boot.spi.SessionFactoryBuilderFactory;
import org.hibernate.boot.spi.SessionFactoryBuilderImplementor;

public class EntityMetaData implements SessionFactoryBuilderFactory {

    private static final ThreadLocal<MetadataImplementor> meta = new ThreadLocal<>();

    @Override
    public SessionFactoryBuilder getSessionFactoryBuilder(MetadataImplementor metadata, SessionFactoryBuilderImplementor defaultBuilder) {
        meta.set(metadata);
        return defaultBuilder;
    }

    public static MetadataImplementor getMeta() {
        return meta.get();
    }
}

您将需要该文件:

/resources/META-INF/services/org.hibernate.boot.spi.SessionFactoryBuilderFactory

使用完全限定的类名,在我的示例中是:

org.broadleafcommerce.openadmin.server.dao.EntityMetaData

获取PersisterCreationContext的对象,然后尝试: -

PersistentClass persistentClass = 
persisterCreationContext.getMetadata().getEntityBinding(className);

请检查此链接示例3.8。本机Bootstrapping - 将它们放在一起 )以了解如何在Hibernate 5.x获取standardRegistry,metadata和sessionFactory

现在,当我们从persisterCreationContext中提取元数据时,现在我们已经拥有了它,所以我们可以立即获取任何实体所需的PersistentClass对象

SessionFactory sessionFactory = metadata.getSessionFactoryBuilder().build();
PersistentClass persistentClass = metadata.getEntityBinding(className);

在Hibernate 3和4中你会做这样的事情

URL configFileURL = getResource(); //some method to get hold of the location of your hibernate.cfg.xml
Configuration configuration = (new Configuration()).configure(configFileURL);
Iterator classMappings = configuration.getClassMappings();
  while (classMappings.hasNext()) {
    PersistentClass persistentClass = (PersistentClass) classMappings.next();
    //do somthing 
    }

在Hibernate 5中初始化元数据就像这样

URL configFileURL = getResource(); //some method to get hold of the location of your hibernate.cfg.xml
StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder().configure(configFileURL).build();
Metadata metaData = new MetadataSources(standardRegistry).getMetadataBuilder().build();

并在元数据上使用getEntityBindings()

Collection<PersistentClass> entityBindings = metadata.getEntityBindings();
Iterator<PersistentClass> iterator = entityBindings.iterator();
  while (iterator.hasNext()) {
    PersistentClass persistentClass = iterator.next();    
    //do somthing
  }

这在Hibernate 5.0迁移指南以及Hibernate用户指南中Bootstrap章节中进行了讨论 (特别参见“Legacy Bootstrapping”附录)。

简而言之,虽然直接引导仍然支持Configuration,但如果要“挂钩”引导过程,则必须使用新的引导API。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM