java - 在 Spring Boot 中创建数据库表后运行自定义脚本

标签 java spring hibernate spring-boot spring-data-jpa

我在我的项目中使用 Spring Boot 和 gradle,项目结构如下:

src/
├── main
│   ├── java
│   └── resources
│       └── import.sql
├── scripts
│   └── custom_script.sql
└── test
    ├── java
    │   ├── persistent
    │   │   └── UserRepositoryTest.java
    │   └── TestConfiguration.java
    └── resources
        └── import.sql

custom_script.sql中我有一些我的应用程序需要的sql脚本,例如在插入之前触发等等。是否可以配置应用程序,例如使用应用程序属性文件、 hibernate 或其他某种方式来加载该脚本并在创建表后创建触发器?

我已将表定义为 JPA 实体。所以我预期的步骤顺序是:

  1. 从 JPA 实体创建表
  2. 从 script/custom_script.sql 加载触发器
  3. resources/import.sql加载插入脚本
  4. 运行应用程序/测试(这取决于我是否决定运行主应用程序或测试)

出于测试目的,我尝试创建 TestConfiguration.java 接口(interface),在其中使用 @Sql 注释:

@Sql("src/scripts/custom_script.sql")
public interface TestConfiguration {
}

接下来我想使用这个接口(interface)进行需要这样的脚本的测试:

@Transactional
@SpringBootTest
@RunWith(SpringRunner.class)
public class UserRepositoryTest implements TestConfiguration {

}

问题是:

  1. 我的解决方案不起作用
  2. 仅涵盖测试用例,不涵盖应用程序正常启动时的情况

你能帮我吗?谢谢。

最佳答案

@Sql 仅适用于测试:

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/context/jdbc/Sql.html

但是您可以尝试以下操作。 将脚本文件夹放在 src/test/resources 下,将脚本添加到类路径

然后在 UserRepositoryTest 类上设置@Sql注释并将路径更改为:

@Sql("classpath:scripts/custom_script.sql")

如果您想在其他测试中使用它,请创建一个带有所需注释的抽象测试类。

如果您需要真正的数据库迁移,请查看 Flyway:https://flywaydb.org/

关于java - 在 Spring Boot 中创建数据库表后运行自定义脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48909046/

相关文章:

java - 为什么 NoUniqueBeanDefinitionException : No qualifying bean of type is defined: expected single matching bean but found 2

java - Spring Controller 生成的 JSON 内容无效(使用 Jackson 库)

java.lang.AbstractMethodError : at org. apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.setCharacterStream(DelegatingPreparedStatement.java:328)

java - 如何返回到 XPath 中的直接父级并获取文本?

java - 无法在 WebSphere Application Server 中配置队列连接工厂

java - 使用 JAXB 编码 LocalDate

java - 无法通过 jconn4.jar/Sybase 驱动程序版本 7 和 Mybatis 框架更新 Sybase 数据库中的多条记录

spring - 扩展spring表单标签库属性

java - 如何处理 org.hibernate.ObjectNotFoundException

java - SQLFunctionTemplate 不应用查询参数的顺序