10

hibernate 4 - spring 4 セットアップでは、SchemaExportオブジェクトを使用して DDL を生成できました。

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

ただし、休止状態 5 はSchemaExport(Configuration configuration)コンストラクターをSchemaExport(MetadataImplementator metadataImplementator).

MetadataImplementator はすぐには利用できません

org.springframework.orm.hibernate5.LocalSessionFactoryBeanまた org.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 のバグなのか、このセットアップのバグなのかわかりません。

休止状態の 5.0.0.CR4と春の4.2.0.RELEASEを使用しています

4

2 に答える 2

2

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);

ここで見つけることができる追加情報Hibernate 5およびSpring 4を使用したProgrammatic Sc​​hemaExport / SchemaUpdate

Java Persistence API にはConfiguration over Convention原則がありますが、Validation 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;

詳細は こちら

于 2016-01-10T03:14:02.587 に答える