gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:37:29 25 4
gpt4 key购买 nike

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

LocalSessionFactoryBean sfb = (LocalSessionFactoryBean) context.getBean("&sessionFactory");
SchemaExport schema = new SchemaExport(sfb.getConfiguration());

但是 hibernate 5 将 SchemaExport(Configuration configuration) 构造函数替换为 SchemaExport(MetadataImplementatormetadataImplementator)

MetadataImplementator 不容易在

上使用

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

我是这样破解的:

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 或此设置中的错误。

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

最佳答案

您需要实现org.hibernate.integrator.spi.Integrator,您可以在其中将所需数据存储到某个持有者。

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

<小时/>

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

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) {
}
}
<小时/>

使用它

    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 持久性 API 遵循配置优于约定的原则,但验证 API 仅用于验证目的。验证不是绝对的,您可以在同一字段上放置不同的验证规则。

如果你有例如

@Size(max = 50)
@NotNull(groups = DefaultGroup.class)
@Null(groups = SecondGroup.class)
private String shortTitle;

然后它被解释为

@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?

关于spring - hibernate 5 和 spring - 使用 SchemaExport 生成 ddl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32090535/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com