I want generate create and drop ddl scripts using spring boot v1.4.3 with JPA - Hibernate 5.0.11.
Most answers I found use the javax.persistence.schema-generation
properties. E.g. https://stackoverflow.com/a/36966419/974186
The problem with this approach is the it outputs the sql statements without an delimiter. E.g.
create table ... (...)
create table ... (...)
I want it to output the statements with the delimiter ;
create table ... (...);
create table ... (...);
But I can't find any javax.persistence.schema-generation
property to configure it.
So I thought to use the SchemaExport
from hibernate, because you can set the delimiter property. But to create a SchemaExport
I need a MetadataImplementor
(non deprected api).
I can not figure out how to get a MetadataImplementor
from spring boot.
Does anyone know if there is either
- a
javax.persistence.schema-generation
property to define the delimiter - or how to create a
SchemaExport
(get the dependencies) - or has another solution?
Here is some code you can play with
@SpringBootApplication
@ComponentScan(basePackageClasses = Application.class)
@EntityScan(basePackageClasses = User.class)
public class Application {
@Bean
public ApplicationRunner getApplicationRunner() {
return new ApplicationRunner() {
public void run(ApplicationArguments args) throws Exception {
// MetadataImplementor metadataImplementor = ???;
// new SchemaExport(metadataImplementor);
}
};
}
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
application.run(args);
}
}
Entity Class
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
private String name;
public Long getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Another entity class
@Entity
public class Person {
@Id
@GeneratedValue
private Long id;
private String name;
public Long getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
application.properties
spring.jpa.properties.javax.persistence.schema-generation.create-source=metadata
spring.jpa.properties.javax.persistence.schema-generation.scripts.action=create
spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target=create.sql
maven dependencies
<properties>
<spring.boot.version>1.4.3.RELEASE</spring.boot.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
</dependencies>
With Hibernate 5.0
I just tried the code above with hibernate 5.0.11.Final
. The only thing you must change is
SchemaExport schemaExport = new SchemaExport((MetadataImplementor) metadata);
schemaExport.setDelimiter(";");
schemaExport.setFormat(false);
schemaExport.setOutputFile(dropAndCreateDdlFile.getAbsolutePath());
schemaExport.execute(true, false, false, false);
or of course let the java configuration return a MetadataImplementor
instead of Metadata
and change the ApplicationRunner
constructor param.
It's maybe a workaround but in my case it's enough to add semicolons during the build of the project. You can do that using a maven plugin, e.g.:
I have modified the solution from René to work in Spring Boot 2. Tested with version 2.0.4:
Finally after a lot of investigation I think I found an easy solution that uses public APIs. The solution I found uses hibernate
5.2
(more concrete5.2.6.Final
). But I think it can also be adapted to5.0
Here is my spring java configuration
The java configuration creates a
Metadata
bean. This bean can be used in hibernate 5.2 to execute a schema generation. E.g.The hibernate dialect is configured using the spring boot
application.properties
. In my case:What I found out is that the
sessionFactory
holds theschemaExport
values likecreateSQL, dropSQL, outputFile
anddelimiter
.The
sessionFactory
as a Bean can be created like that and is then available for autowiring:That is not a working solution but could help you to manually configure the schemaExport using sessionFactory. I dont find a solution for just using the properties and setting the delimiter just there. But could be a little helper for finding the working solution.
If I find more useful infos I will update my answer.