I tried using this class:
Hibernate/JPA: Check generated sql before updating DB Schema (like .NET EF migrations)
I have the following code:
pack
I wrote a class for generating sql script depends on packages with entites.
Used version of hibernate is '5.3.7.Final'
public final class HibernateExporter {
private static final Logger LOG = LoggerFactory.getLogger(HibernateExporter.class);
private static final String OUTPUT_FILE = "schema.sql";
private static final String DIALECT = "org.hibernate.dialect.H2Dialect";
private List entityPackages;
private HibernateExporter(List entityPackages) {
this.entityPackages = entityPackages;
}
public static void main(String[] args) {
final List entityPackages = Collections.singletonList("pakage.with.entites");
HibernateExporter exporter = new HibernateExporter(entityPackages);
exporter.export();
}
private void export() {
SchemaExport export = new SchemaExport();
export.setOutputFile(OUTPUT_FILE);
export.setFormat(true);
export.setDelimiter(";");
EnumSet types = EnumSet.of(TargetType.SCRIPT);
Metadata metadata = createMetadataSources().buildMetadata();
export.execute(types, Action.CREATE, metadata);
}
private MetadataSources createMetadataSources() {
MetadataSources metadata = new MetadataSources(
new StandardServiceRegistryBuilder()
.applySetting("hibernate.dialect", DIALECT)
.build());
for (String entityPackage : entityPackages) {
final Reflections reflections = new Reflections(entityPackage);
for (Class> cl : reflections.getTypesAnnotatedWith(MappedSuperclass.class)) {
metadata.addAnnotatedClass(cl);
LOG.info(String.format("Mapped = %s", cl.getName()));
}
for (Class> cl : reflections.getTypesAnnotatedWith(Entity.class)) {
metadata.addAnnotatedClass(cl);
LOG.info(String.format("Mapped = %s", cl.getName()));
}
}
return metadata;
}
}