如何使用现代的Spring Boot + Data JPA和Hibernate设置生成DDL创建脚本?
如何使用现代的Spring Boot + Data JPA和Hibernate设置生成DDL创建脚本?
目前,我正在使用默认的@SpringBootApplication
注解以及在application.properties
中的以下属性:\n
spring.datasource.url=jdbc:mysql://localhost/dbname spring.datasource.username=X spring.datasource.password=X spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.jpa.hibernate.naming_strategy=my.package.CustomNamingStrategy
\n自从JPA 2.1以来,我应该能够使用javax.persistence.schema-generation.*
属性,但是在我的application.properties中设置它们似乎没有效果。\n我看到了一些类似这样的示例,它们连接了一堆额外的bean,但是它们没有使用Mysql。而且无论如何,像那样做需要我配置许多Spring现在已经为我处理的选项。\n我的目标是:\n
- \n
- 生成一个在MYSQL方言中的模式创建SQL脚本
- 不需要数据库连接
- 将脚本输出到构建目录
- 同时生成Hibernate Envers表将是一个巨大的加分项。
\n
\n
\n
\n
\n我不想:\n
- \n
- 在实际数据库上创建/删除模式
\n
\n库版本:\n
hibernate : 4.3.11.FINAL spring framework : 4.2.5.RELEASE spring-boot : 1.3.3.RELEASE spring-data-jpa : 1.10.1.RELEASE // 用于支持querydsl 4 spring-data-commons: 1.12.1.RELEASE // 用于支持querydsl 4
\n(使用gradle而不是maven)
问题的出现原因:
在现代的Spring Boot + Data JPA和Hibernate设置中,有时需要生成DDL创建脚本,但又不想启动主应用程序。因此需要找到一种方法来独立生成模式。
解决方法:
通过使用Hibernate和Reflections库,可以编写一个独立的代码来生成DDL。下面是一个示例代码,它使用了以下依赖项:
- org.hibernate:hibernate-core
- org.reflections:reflections
示例代码中的generateSchema方法实现了生成DDL的逻辑。它首先创建一个StandardServiceRegistryBuilder实例,并设置Hibernate方言。然后通过scanForEntities方法扫描指定的包,找到所有被@Entity注解的类。接下来,使用MetadataSources将这些实体类添加到元数据中。最后,使用SchemaExport生成DDL脚本,并将其写入指定的输出文件中。
这样,通过运行SchemaGenerator类的main方法,就可以独立生成DDL脚本,而无需启动主应用程序。
问题的出现原因:
该问题是因为需要使用Spring Boot + Data JPA和Hibernate来生成DDL创建脚本,但是需要找到正确的配置方法来实现这一目标。
解决方法:
通过以下的yml配置文件或者properties配置文件来实现DDL创建脚本的生成:
1. 在yml配置文件中的spring.jpa.properties中添加以下配置:
spring:
jpa:
properties:
javax:
persistence:
schema-generation:
create-source: metadata
scripts:
action: create
create-target: create.sql
2. 在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
3. 根据需要,可以更改生成脚本的行为。默认情况下,生成的脚本会追加到现有的文件中,可以通过修改配置来更改这一行为。
通过上述配置,就可以使用现代的Spring Boot + Data JPA和Hibernate设置来生成DDL创建脚本了。
如何使用现代的Spring Boot + Data JPA和Hibernate配置生成DDL创建脚本?
问题的出现的原因:
提问者在使用Spring Boot + Data JPA和Hibernate配置时想要生成DDL创建脚本,但不清楚如何实现。
解决方法:
通过查看Spring Data文档的一个部分,提问者找到了解决方法。在配置文件中使用spring.jpa.properties前缀来指定javax.persistence属性,即可实现自动生成DDL脚本。具体配置如下:
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
配置完成后,自动生成的schema文件将保存在项目的根目录下。如果想要在不运行整个应用程序的情况下生成DDL脚本,可以使用Flyway来管理数据库架构。
其他相关问题和建议:
- 是否有办法在每个DDL命令的末尾添加分号?
- 是否可以在不运行整个应用程序的情况下执行DDL脚本?
- 是否有办法只生成特定包下的实体类的DDL脚本?
- 如何在现有数据库上生成"update.sql"而不是在空数据库上生成DDL脚本?
- 生成的文件是否可以替换而不是追加?
最后,需要注意的是,根据最新的Jakarta Persistence规范,属性名应以`spring.jpa.properties.jakarta.persistence.`开头,而不是`spring.jpa.properties.javax.persistence.`。