Spring Boot在启动时将示例数据插入数据库

时间:2017-06-25 18:23:15

标签: spring-boot spring-data-jpa

在服务器启动时创建测试数据并将其插入数据库的正确方法是什么(我使用JPA / JDBC支持的Postgres实例)。

最好以创建实体的形式,并通过Repository接口持久化而不是编写纯SQL代码。像RoR的Rake db:seed助手那样。

如果框架在注入所有bean并且数据库准备就绪时公开了一个用于执行操作的挂钩,那么这也可以工作。

3 个答案:

答案 0 :(得分:19)

您可以捕获ApplicationReadyEvent然后插入演示数据,例如:

@Component
public class DemoData {

    @Autowired
    private final EntityRepository repo;

    @EventListener
    public void appReady(ApplicationReadyEvent event) {

        repo.save(new Entity(...));
    }
}

或者您可以实现CommandLineRunnerApplicationRunner,以便在应用程序完全启动时加载演示数据:

@Component
public class DemoData implements CommandLineRunner {

    @Autowired
    private final EntityRepository repo;

    @Override
    public void run(String...args) throws Exception {

        repo.save(new Entity(...));
    }
}

@Component
public class DemoData implements ApplicationRunner {

    @Autowired
    private final EntityRepository repo;

    @Override
    public void run(ApplicationArguments args) throws Exception {

        repo.save(new Entity(...));
    }
}

甚至可以像你的应用程序(或其他'config')类中的Bean一样实现它们:

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public CommandLineRunner demoData(EntityRepository repo) {
        return args -> { 

            repo.save(new Entity(...));
        }
    }
}

答案 1 :(得分:4)

来自Spring文档:http://docs.spring.io/spring-boot/docs/1.5.4.RELEASE/reference/htmlsingle/#howto-database-initialization

  

使用Hibernate初始化数据库   如果Hibernate从头开始创建架构(即ddl-auto属性设置为create或create-drop),则在启动时将在启动时执行类路径根目录中名为 import.sql 的文件。这对于演示和测试很有用,如果你小心,但可能不是你想要在生产中的类路径上。这是一个Hibernate功能(与Spring无关)。

答案 2 :(得分:1)

你可以这样做

LPCSTR printer = R"(\\gisrv44.wekal.de\wkkp04)";

PRINTER_DEFAULTSA pDefault;
pDefault.DesiredAccess = PRINTER_ACCESS_ADMINISTER;

// Open a handle to the printer. 
bStatus = OpenPrinterA(szPrinterName, &hPrinter, &pDefault);