栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

带有Hibernate 5和Spring 4的程序化SchemaExport / SchemaUpdate

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

带有Hibernate 5和Spring 4的程序化SchemaExport / SchemaUpdate

我想加总Aviad的答案,以按照OP的要求完成它。

内部:

为了获得metadataImplementor的实例,解决方法是通过Java的ServiceLoader工具注册SessionFactoryBuilderFactory的实例。然后,在引导hibernate模式时,metadataImplementor会使用其自身的实例调用此注册服务的getSessionFactoryBuilder方法。代码参考如下:

  1. 服务加载
  2. 调用getSessionFactoryBuilder

因此,最终要获得metadataImplementor的实例,必须实现SessionFactoryBuilderFactory并注册,以便ServiceLoader可以识别此服务:

SessionFactoryBuilderFactory的实现:

    public class metadataProvider implements SessionFactoryBuilderFactory {        private static metadataImplementor metadata;        @Override        public SessionFactoryBuilder getSessionFactoryBuilder(metadataImplementor metadata, SessionFactoryBuilderImplementor defaultBuilder) { this.metadata = metadata; return defaultBuilder; //Just return the one provided in the argument itself. All we care about is the metadata:)        }        public static metadataImplementor getmetadata() { return metadata;        }    }

为了注册以上内容,请在以下路径中创建简单的文本文件(假设它是一个maven项目,最终我们需要在类路径中提供“ meta-INF”文件夹):

src/main/resources/meta-INF/services/org.hibernate.boot.spi.SessionFactoryBuilderFactory

文本文件的内容应为一行(如果需要注册多个实例,甚至可以为多行),说明SessionFactoryBuilderFactory实现的完全限定的类路径。例如,对于上述类,如果您的程序包名称为“
com.yourcompany.prj”,则文件内容应为以下内容。

com.yourcompany.prj.metadataProvider

就是这样,如果您运行应用程序,spring应用程序或独立的hibernate模式,则在启动hibernate模式后,将通过静态方法获得一个metadataImplementor实例。

更新1:

无法通过Spring注入它。我研究了Hibernate的源代码,并且元数据对象没有存储在SessionFactory中的任何位置(这是我们从Spring获得的)。因此,不可能注入它。但是,如果您希望使用Spring的方式,则有两种选择:

  1. 扩展现有的类并从头开始进行自定义

LocalSessionFactoryBean-> metadataSources-> metadataBuilder

LocalSessionFactoryBean是您在Spring中配置的,并且具有metadataSources对象。metadataSources创建metadataBuilder,后者又创建metadataImplementor。以上所有操作均不存储任何内容,它们只是动态创建对象并返回。如果要使用metaData实例,则应扩展和修改上述类,以便它们在返回之前存储相应对象的本地副本。这样,您可以引用metadataImplementor。但是除非确实需要,否则我不会真正推荐这样做,因为API可能会随着时间而变化。

  1. 另一方面,如果您不介意从SessionFactory构造metaDataImplemetor,则以下代码将为您提供帮助:
        EntityManagerFactoryImpl emf=(EntityManagerFactoryImpl)lcemfb.getNativeEntityManagerFactory();    SessionFactoryImpl sf=emf.getSessionFactory();    StandardServiceRegistry serviceRegistry = sf.getSessionFactoryOptions().getServiceRegistry();    metadataSources metadataSources = new metadataSources(new BootstrapServiceRegistryBuilder().build());    metadata metadata = metadataSources.buildmetadata(serviceRegistry);    SchemaUpdate update=new SchemaUpdate(serviceRegistry,metadata); //To create SchemaUpdate    // You can either create SchemaExport from the above details, or you can get the existing one as follows:    try {        Field field = SessionFactoryImpl.class.getDeclaredField("schemaExport");        field.setAccessible(true);        SchemaExport schemaExport = (SchemaExport) field.get(serviceRegistry);    } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {        e.printStackTrace();    }


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/430549.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号