2015-08-19 10 views
9

In Hibernate 4 - Feder 4 Setup es möglich war, DDL zu generieren mit SchemaExport Objekt:winter 5 und Feder - DDL generieren mit Schema

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

Aber winter 5 SchemaExport(Configuration configuration) Konstruktor mit SchemaExport(MetadataImplementator metadataImplementator) ersetzt.

MetadataImplementator ist nicht ohne weiteres verfügbar auf

org.springframework.orm.hibernate5.LocalSessionFactoryBean oder org.springframework.orm.hibernate5.LocalSessionFactoryBuilder

ich es so gehackt:

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

Aber es wäre schön, (eine bessere Möglichkeit zu haben, und auch, Validator Anmerkungen @NotNull, @Size) werden nicht für die DDL-Generierung verwendet und ich weiß nicht, ob es sich um einen Fehler in Hibernate 5 oder diesem Setup handelt.

Ich verwende Hibernate 5.0.0.CR4 und Feder 4.2.0.RELEASE

Antwort

2

Sie müssen org.hibernate.integrator.spi.Integrator implementieren, wo Sie Daten zu einem gewissen Halter erforderlich speichern kann.

Arbeits Beispiel finden Sie hier https://github.com/valery-barysok/spring4-hibernate5-stackoverflow-34612019


es als Dienst an META-INF/services/org.hibernate.integrator.spi.Integrator Datei

new SchemaExport((MetadataImplementor) HibernateInfoHolder.getMetadata()).create(true, true); 
    new SchemaUpdate(HibernateInfoHolder.getServiceRegistry(), (MetadataImplementor) HibernateInfoHolder.getMetadata()).execute(true, true); 

Zusatzinfo

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) { 
    } 
} 

Verwenden

es registrieren Hier finden Sie Programmatic SchemaExport/SchemaUpdate with Hibernate 5 and Spring 4

Es gibt Configuration over Convention Prinzip für Java Persistence API, aber Validierungs-API ist nur für Validierungszwecke gedacht. Die Validierung ist nicht absolut. Sie können verschiedene Validierungsregeln auf dasselbe Feld anwenden.

, wenn Sie zum Beispiel haben

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

dann wird interpretiert als

@Size(max = 50) 
@NotNull(groups = DefaultGroup.class) 
@Null(groups = SecondGroup.class) 
@Column(length = 255, nullable = true) 
private String shortTitle; 

weitere Details hier Why does Hibernate Tools hbm2ddl generation not take into account Bean Validation annotations?

1

Für Hibernate 5.2.7 (in meinem Fall) I‘ ve hat eine Methode zum Exportieren eines Schemas geschrieben, die auf Paketscan basiert:

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); 
} 
+0

Sorry, Sie sagen, dass "Dialekt" weggelassen werden könnte, aber eigentlich versuche ich genau dasselbe zu tun, aber wenn ich den Dialekt nicht setze bekomme ich den Fehler 'org.hibernate.HibernateException: Access to DialectResolutionInfo darf nicht null sein, wenn 'hibernate.dialect' nicht gesetzt ist. Hast du irgendwelche Vorschläge, warum das passiert? – Luca

+0

Leider konnte ich momentan nicht beantworten in welchen Fällen es funktioniert. Vielleicht hängt es von 'dataSource' ab ... –