首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >hibernate 5和spring -使用SchemaExport生成ddl

hibernate 5和spring -使用SchemaExport生成ddl
EN

Stack Overflow用户
提问于 2015-08-19 08:41:29
回答 2查看 7.4K关注 0票数 10

在hibernate 4- spring 4设置中,可以使用SchemaExport对象生成DDL:

代码语言:javascript
复制
LocalSessionFactoryBean sfb = (LocalSessionFactoryBean) context.getBean("&sessionFactory");
SchemaExport schema = new SchemaExport(sfb.getConfiguration());  

但是hibernate 5用SchemaExport(MetadataImplementator metadataImplementator)代替了SchemaExport(MetadataImplementator metadataImplementator)构造函数。

MetadataImplementator并不容易在

org.springframework.orm.hibernate5.LocalSessionFactoryBeanorg.springframework.orm.hibernate5.LocalSessionFactoryBuilder

我像这样黑了它:

代码语言:javascript
复制
MetadataSources metadataSources = (MetadataSources) FieldUtils.readField(configuration, "metadataSources", true);


Metadata metadata = metadataSources
    .getMetadataBuilder(configuration.getStandardServiceRegistryBuilder().build())
    .applyPhysicalNamingStrategy(new MyPhysicialNamingStrategy())
    .applyImplicitNamingStrategy(ImplicitNamingStrategyJpaCompliantImpl.INSTANCE)
    .build();

MetadataImplementor metadataImpl = (MetadataImplementor) metadata;
SchemaExport schema = new SchemaExport(metadataImplementor);

但是最好有一个更好的方法,而且Validator注释(@NotNull,@Size)不用于DDL生成,我不知道它是Hibernate 5中的bug还是这个设置中的错误。

我正在使用hibernate 5.0.0.CR4和spring 4.2.0。

EN

回答 2

Stack Overflow用户

发布于 2016-01-10 03:14:02

您需要实现org.hibernate.integrator.spi.Integrator,在这里您可以将所需的数据存储给某个持有者。

工作示例,您可以在这里找到https://github.com/valery-barysok/spring4-hibernate5-stackoverflow-34612019

将其注册为META-INF/services/org.hibernate.integrator.spi.Integrator文件中的服务

代码语言:javascript
复制
public class Integrator implements org.hibernate.integrator.spi.Integrator {

    @Override
    public void integrate(Metadata metadata, SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) {
        HibernateInfoHolder.setMetadata(metadata);
        HibernateInfoHolder.setSessionFactory(sessionFactory);
        HibernateInfoHolder.setServiceRegistry(serviceRegistry);
    }

    @Override
    public void disintegrate(SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) {
    }
}

用它

代码语言:javascript
复制
    new SchemaExport((MetadataImplementor) HibernateInfoHolder.getMetadata()).create(true, true);
    new SchemaUpdate(HibernateInfoHolder.getServiceRegistry(), (MetadataImplementor) HibernateInfoHolder.getMetadata()).execute(true, true);

更多信息,您可以在这里找到Programmatic SchemaExport / SchemaUpdate with Hibernate 5 and Spring 4

Java有Configuration over Convention原则,但验证API仅用于验证目的。验证不是绝对的,您可以在同一字段中放置不同的验证规则。

例如,如果你有

代码语言:javascript
复制
@Size(max = 50)
@NotNull(groups = DefaultGroup.class)
@Null(groups = SecondGroup.class)
private String shortTitle;

然后它被解释为

代码语言:javascript
复制
@Size(max = 50)
@NotNull(groups = DefaultGroup.class)
@Null(groups = SecondGroup.class)
@Column(length = 255, nullable = true)
private String shortTitle;

请参阅更多详细信息,这里是Why does Hibernate Tools hbm2ddl generation not take into account Bean Validation annotations?

票数 2
EN

Stack Overflow用户

发布于 2017-02-03 19:00:53

对于Hibernate 5.2.7 (在我的例子中),我编写了一个基于包扫描(如:

代码语言:javascript
复制
static void exportSchema(
        DataSource dataSource,
        Class<? extends Dialect> dialect,
        String... packagesToScan) {

    StandardServiceRegistryBuilder registryBuilder = new StandardServiceRegistryBuilder()
            .applySetting(DATASOURCE, dataSource)
            .applySetting(DIALECT, dialect); // dialect could be omitted
    MetadataSources metadataSources = new MetadataSources(registryBuilder.build());

    PathMatchingResourcePatternResolver resourceLoader = new PathMatchingResourcePatternResolver();
    new LocalSessionFactoryBuilder(null, resourceLoader, metadataSources)
            .scanPackages(packagesToScan);

    Metadata metadata = metadataSources.buildMetadata();

    new SchemaExport()
            .setFormat(true)
            .create(EnumSet.of(STDOUT, DATABASE), metadata);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32090535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档