【发布时间】:2017-06-09 11:42:21
【问题描述】:
我想使用 Spring Boot v1.4.3 和 JPA - Hibernate 5.0.11 生成创建和删除 ddl 脚本。
我发现的大多数答案都使用javax.persistence.schema-generation 属性。例如。 https://stackoverflow.com/a/36966419/974186
这种方法的问题是它输出的 sql 语句没有分隔符。例如
create table ... (...)
create table ... (...)
我希望它输出带有分隔符;的语句
create table ... (...);
create table ... (...);
但我找不到任何javax.persistence.schema-generation 属性来配置它。
所以我想使用hibernate的SchemaExport,因为你可以set the delimiter property。但是要创建一个SchemaExport,我需要一个MetadataImplementor(未弃用的api)。
我不知道如何从 spring boot 中获取MetadataImplementor。
有谁知道有没有
- 一个
javax.persistence.schema-generation属性来定义分隔符 - 或如何创建
SchemaExport(获取依赖项) - 或者有其他解决方案?
这里有一些你可以玩的代码
@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
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;
}
}
另一个实体类
@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 依赖项
<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>
使用休眠 5.0
我刚刚用休眠5.0.11.Final 尝试了上面的代码。你唯一需要改变的是
SchemaExport schemaExport = new SchemaExport((MetadataImplementor) metadata);
schemaExport.setDelimiter(";");
schemaExport.setFormat(false);
schemaExport.setOutputFile(dropAndCreateDdlFile.getAbsolutePath());
schemaExport.execute(true, false, false, false);
或者当然让 java 配置返回 MetadataImplementor 而不是 Metadata 并更改 ApplicationRunner 构造函数参数。
【问题讨论】:
标签: spring hibernate spring-boot spring-data-jpa ddl