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

时间:2018-02-21 14:59:34

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

我在项目中使用带有gradle的Spring Boot,具有以下项目结构:

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. 从scripts / custom_script.sql
  3. 加载触发器
  4. resources/import.sql
  5. 加载插入脚本
  6. 运行应用程序/测试(这取决于我是否决定运行主应用程序或测试)
  7. 出于测试目的,我尝试创建TestConfiguration.java接口,我在其中使用@Sql anotation:

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

    接下来我想将此接口用于需要此脚本的测试:

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

    问题是:

    1. 我的解决方案无效
    2. 仅覆盖测试用例,而非应用程序正常启动的情况
    3. 你可以帮帮我吗?感谢。

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分:0)

查看Flyway https://flywaydb.org/。此插件允许在启动期间进行数据库迁移,并可以对数据库执行各种操作以从一个版本迁移到另一个版本。这将满足您的需求。