Tagbangers Blog

Hibernate5 で SchemaExport

Hibernate5 から SchemaExport のコンストラクタの引数が変更され、MetadataImplementor を使うようになった。
以下は、Hibernate5 で Annotation ベースの設定を SQL (DDL) に出力するサンプルです。

public class Hbm2ddl {

   public static void main(String[] args) throws Exception {
      final String locationPattern = "classpath:/sample/entity/*";

      final BootstrapServiceRegistry registry = new BootstrapServiceRegistryBuilder().build();
      final MetadataSources metadataSources = new MetadataSources(registry);
      final StandardServiceRegistryBuilder registryBuilder = new StandardServiceRegistryBuilder(registry);

      registryBuilder.applySetting("hibernate.dialect", MySQL5InnoDBDialect.class.getCanonicalName());

      final PathMatchingResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
      final Resource[] resources = resourcePatternResolver.getResources(locationPattern);
      final SimpleMetadataReaderFactory metadataReaderFactory = new SimpleMetadataReaderFactory();
      for (Resource resource : resources) {
         MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(resource);
         AnnotationMetadata metadata = metadataReader.getAnnotationMetadata();
         if (metadata.hasAnnotation(Entity.class.getName())) {
            metadataSources.addAnnotatedClass(Class.forName(metadata.getClassName()));
         }
      }

      final StandardServiceRegistryImpl registryImpl = (StandardServiceRegistryImpl) registryBuilder.build();
      final MetadataBuilder metadataBuilder = metadataSources.getMetadataBuilder(registryImpl);

      new SchemaExport((MetadataImplementor) metadataBuilder.build())
            .setHaltOnError(true)
            .setDelimiter(";")
            .create(true, false);
   }
}