hibernate 如何在应用程序启动/加载期间执行SQL插入查询来填充数据库?

8fsztsew  于 2023-10-23  发布在  其他
关注(0)|答案(4)|浏览(118)

我想载入一些数据到MySQL数据库在应用程序的加载。我使用Hibernate来管理应用程序的数据库。我可以在groovy中使用Bootstrap来实现它,但我想在Java中实现它。它是基于Spring MVC的Web应用程序。
虽然在互联网上搜索,我发现,但使用名为import_file的Hibernate属性,我可以实现它,但我正在寻找一个替代路线。

t30tvxxf

t30tvxxf1#

你也可以利用Spring的DataSourceInitializer。下面是一个Java Config的例子。

@Bean
public DataSourceInitializer dataSourceInitializer() {
    ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();
    resourceDatabasePopulator.addScript(new ClassPathResource("/data.sql"));

    DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();
    dataSourceInitializer.setDataSource(dataSource());
    dataSourceInitializer.setDatabasePopulator(resourceDatabasePopulator);
    return dataSourceInitializer;
}
vdgimpew

vdgimpew2#

Spring已经提供了一种用内容初始化数据库的方法,使用DatabasePopulator。这是我找到的一个quick example,用于Spring Batch示例应用程序。要在该代码中查看的类是ResourceDatabasePopulator。Another example在Spring Social项目示例中。

8yparm6h

8yparm6h3#

我会在Spring context configuration中注册一个 * ApplicationEvent * 的示例,它会监听 ContextRefreshedEvent,当应用程序上下文完成初始化或刷新时会发出信号。在此之后,您可以设置您的数据库人口。
下面你将找到实现这一点所需的ApplicationServer实现(它依赖于负责执行数据库操作的DAO)和Spring配置(Java和XML)。您需要选择特定于您的应用的配置:

基于Java的配置

@Configuration
public class JavaConfig {

    @Bean
    public ApplicationListener<ContextRefreshedEvent> contextInitFinishListener() {
        return new ContextInitFinishListener(personRepository());
    }

    @Bean
    public PersonRepository personRepository() {
        return new PersonRepository();
    }
}

XML格式

<bean class="com.package.ContextInitFinishListener">
        <constructor-arg>
            <bean class="com.package.PersonRepository"/>
        </constructor-arg>
    </bean>

这是ContextInittershocks类的代码:

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;

public class ContextInitFinishListener implements ApplicationListener<ContextRefreshedEvent> {

    private PersonRepository personRepository;

    public ContextInitFinishListener(PersonRepository personRepository) {
        this.personRepository = personRepository;
    }

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        //populate database with required values, using PersonRepository
    }
}

**注意:**PersonRepository只是示例中的一个通用DAO,它表示您在应用中使用的DAO

jljoyd4f

jljoyd4f4#

我在我的Spring Boot 控制台应用程序测试中使用如下。

ResourceDatabasePopulator rdp = new ResourceDatabasePopulator();
 rdp.addScript(new ClassPathResource("sql/create-tables.sql"));
 rdp.execute(dataSource);

根据应用程序或数据分层框架的类型,有不同的方法来获得数据包。
如果你使用 Spring Boot 来配置h2,你可以使用。

@Autowired
Datasource datasource;

要通过外部配置类获取数据源,请执行以下操作

@Value("${spring.datasource.driver-class-name}")
private String driverClass;

@Value("${spring.datasource.url}")
private String dbUrl;

@Value("${spring.datasource.username}")
private String dbUserName;

@Value("${spring.datasource.password}")
private String dbPassword;

@Bean
public DataSource dataSource(){
    SingleConnectionDataSource dataSource = new 
    SingleConnectionDataSource();
    dataSource.setDriverClassName(driverClass);
    dataSource.setUrl(dbUrl);
    dataSource.setUsername(dbUserName);
    dataSource.setPassword(dbPassword);
    dataSource.setSuppressClose(true);
    dataSource.setAutoCommit(true);
    return dataSource;
}

这对我来说很有效,将你需要执行的所有查询都保存在table-tables.sql中

相关问题