问题描述
从Hibernate 4迁移到5时,我遇到了弃用,并最终删除了SchemaExport(Configuration)
构造函数.在Hibernate 5中,有什么好的选择?
While migrating from Hibernate 4 to 5 I came across the deprecation and eventual removal of the SchemaExport(Configuration)
constructor. What is a good alternative in Hibernate 5?
在测试过程中,我们使用配置了一些属性并定义映射资源的配置创建了SchemaExport
实例:
During testing we create a SchemaExport
instance with a configuration that had some properties set and defines mapping resources:
// somewhere else `Properties` are filled and passed as a parameter
Properties properties = new Properties();
properties.put("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");
properties.put("hibernate.connection.driver_class", "org.hsqldb.jdbc.JDBCDriver");
// more properties ...
Configuration configuration = new Configuration();
configuration.setProperties(testProperties);
// parameter `String... mappingResources`
for (final String mapping : mappingResources) {
configuration.addResource(mapping);
}
// this doesn't compile
SchemaExport schemaExport = new SchemaExport(configuration);
由于已删除构造函数,因此最后一行无法在Hibernate 5上编译.
The last line does not compile on Hibernate 5 because the constructor was removed.
不建议使用SchemaExport(MetadataImplementor)
构造函数,但是我很难找到创建MetadataImplementor
实例的好方法.我找到了一些选择,但是它们对我来说似乎都是腥.
The deprecation recommends to use the SchemaExport(MetadataImplementor)
constructor, but I struggle to find a good way to create a MetadataImplementor
instance. I found a few options, but they all look fishy to me.
我可以在Hibernate中找到的唯一具体实现是MetadataImpl
和InFlightMetadataCollectorImpl
,但是都在org.hibernate.boot.internal
中,所以我假设我不应该使用它们.此外,MetadataImpl
具有庞大的构造函数,其中我需要提供每个小细节,而InFlightMetadataCollectorImpl
需要一个MetadataBuildingOptions
,它与MetadataImplementor
一样具有相同的问题(实现是内部的,难以构造).
The only concrete implementations in Hibernate that I could find are MetadataImpl
and InFlightMetadataCollectorImpl
, but both are in org.hibernate.boot.internal
, so I assume I'm not supposed to use them. Also, MetadataImpl
has a massive constructor in which I need to provide every little detail and InFlightMetadataCollectorImpl
needs a MetadataBuildingOptions
, which has the same problems as MetadataImplementor
(implementation is internal and hard to construct).
或者,看起来MetadataBuilderImpl
可能是构造MetadataImplementor
的便捷方法,但它也是内部的.
Alternatively, it looks like MetadataBuilderImpl
might be a handy way to construct a MetadataImplementor
, but it's also internal.
无论哪种方式,我都找不到如何在MetadataImplementor
(或MetadataBuilderImpl
)上设置Properties
(或其条目)的方法.
Either way, I couldn't find out how to set Properties
(or their entries) on a MetadataImplementor
(or MetadataBuilderImpl
for that matter).
创建SchemaExport
确实需要MetadataImplementor
吗?如果是这样,如何从受支持的API中获取一个?如何设置Properties
?
Is a MetadataImplementor
really required to create a SchemaExport
? If so, how do I get one from a supported API and how do I set Properties
?
最终,我们想使用execute
执行脚本,但是签名也在此处更改.我看到它现在需要一个ServiceRegistry
,所以也许这是一个出路?
Eventually we want to execute a script with execute
, but the signature changed here as well. I see it now takes a ServiceRegistry
, so maybe that would be a way out?
Argh,我刚刚看到在5.2(我想使用)中,SchemaExport
甚至不再使用MetadataImplementor
-仅保留了无参数构造函数.现在怎么办?
Argh, I just saw that in 5.2 (which I want to use) SchemaExport
does not even take a MetadataImplementor
any longer - only the parameterless constructor remains. What now?
推荐答案
从其他答案中提炼出来,我必须执行以下操作:
Distilling from other answers, I had to do the followings:
StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder()
.applySetting("hibernate.hbm2ddl.auto", "create")
.applySetting("hibernate.dialect", "org.hibernate.dialect.MySQLDialect")
.applySetting("hibernate.id.new_generator_mappings", "true")
.build();
MetadataSources sources = new MetadataSources(standardRegistry);
managedClassNames.forEach(sources::addAnnotatedClass);
MetadataImplementor metadata = (MetadataImplementor) sources
.getMetadataBuilder()
.build();
SchemaExport export = new SchemaExport(metadata);
希望有帮助
这篇关于在Hibernate 5中替换SchemaExport(Configuration)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!