25

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

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

请帮助解决此迁移问题。

4

4 回答 4

6

发布到 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
于 2015-10-17T01:37:43.047 回答
2

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

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

请查看此链接示例 3.8. Native Bootstrapping - Putting it all together)以了解如何获取标准注册表、元数据和 sessionFactoryHibernate 5.x

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

SessionFactory sessionFactory = metadata.getSessionFactoryBuilder().build();
PersistentClass persistentClass = metadata.getEntityBinding(className);
于 2015-10-13T08:04:28.890 回答
2

在 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
  }
于 2017-04-27T08:53:13.590 回答
0

这在Hibernate 5.0 Migration Guide以及Hibernate User Guide 中的 Bootstrap 章节中进行了讨论(特别是“Legacy Bootstrapping”附录)。

简而言之,虽然配置仍然支持直线引导,但如果你想“挂钩”引导过程,你将不得不使用新的引导 API。

于 2015-11-13T15:16:07.740 回答