【问题标题】:How to run a custom ddl script on startup of Spring Boot 2如何在 Spring Boot 2 启动时运行自定义 ddl 脚本
【发布时间】:2019-10-07 03:11:25
【问题描述】:

是否可以在启动后运行自定义 ddl 脚本

spring.jpa.hibernate.ddl-auto = 创建

已在数据库中创建模型实体?

目前我对模型进行了很多更改,并希望在更改后删除所有内容并通过以下方式创建测试数据:

@Bean
InitializingBean createTestEntries() {
    return () -> {

        testObject t1 = new testObject (values...);
        testRepo.save(t1);
}

之后我想创建一个数据库视图,但我找不到使用 Spring Boot 2 + Hibernate/JPA 的方法

当然,我可以禁用 ddl-auto 并使用 schema.sql 和 data.sql 文件执行所有操作 - 但我的模型更改会自动填充到 db 中,这非常方便。

所以我想要一个混合模式。我的模型仍然自动填充 - 但我可以在之后调用自定义 ddl 代码来创建视图。

有人可以帮我吗?

【问题讨论】:

    标签: java spring hibernate spring-boot jpa


    【解决方案1】:

    您可以将 Springs JdbcTemplate 注入您的 createTestEntries() 方法并使用它来执行自定义 SQL 以创建您的视图:

    @Bean
    InitializingBean createTestEntries(@Autwired JdbcTemplate jdbc) {
    return () -> {
    
        testObject t1 = new testObject (values...);
        testRepo.save(t1);
    
        jdbc.update("custom SQL here")
    }
    

    根据您的需要,您可以选择注入 DataSource 或 EntityManager(使用本机查询)并使用它。

    编辑:本机查询示例

    @Bean
    InitializingBean createTestEntries(@Autowired EntityManager em) {
       return () -> {
         Query q = em.createNativeQuery("custom sql");
         q.executeUpdate()
       }
    }
    

    查看JPA API Docs了解更多详情:

    【讨论】:

    • 谢谢,成功了!如果不是太多工作,您能否提供使用 EntityManager 的解决方案?
    • 我添加了一个使用实体管理器和本机查询的示例。一般来说,我不建议手动做太多的 DDL 工作。结帐工具,例如 LiquibaseFlyway
    猜你喜欢
    • 2022-01-24
    • 2020-03-01
    • 2016-08-23
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    相关资源
    最近更新 更多