java - 使用 spring data jpa 在启动时将数据保存到数据库

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

我想在 Spring Boot 应用程序启动时将一些实体数据添加到数据库中。我正在使用 spring data jpa 存储库将数据保存到数据库。我尝试过对方法和 ApplicationListener 接口(interface)等使用 @PostConstruct 注释,但没有成功。在这两种情况下都会执行代码,但不会将任何数据写入数据库。我怎样才能实现它?

代码:

@Component
public class DatabaseFillerOnStartup implements ApplicationListener {

    @Autowired
    private UserRepository userRepository;

    private static Logger logger = LoggerFactory.getLogger(DatabaseFillerOnStartup.class);

    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        logger.info("===================================" +event.toString());
        User user = new User("test");
        user.setFirstName("test");
        user.setLastName("test");
        user.setEmail("<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4c38293f380c38293f38622f2321" rel="noreferrer noopener nofollow">[email protected]</a>");
        user.setContactNumber("1234567890");
        userRepository.save(user);
    }

}

配置:

@Configuration
@EnableTransactionManagement
@ComponentScan("com.furniturepool.bll.config" )
@PropertySource(value = "classpath:application.properties" )
public class HibernateConfiguration {

    @Autowired
    private Environment environment;

    @Bean
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setPackagesToScan("domain.package" );
        sessionFactory.setHibernateProperties(hibernateProperties());
        return sessionFactory;
    }

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(environment.getRequiredProperty("spring.datasource.driver-class-name"));
        dataSource.setUrl(environment.getRequiredProperty("spring.datasource.url"));
        dataSource.setUsername(environment.getRequiredProperty("spring.datasource.username"));
        dataSource.setPassword(environment.getRequiredProperty("spring.datasource.password"));
        return dataSource;
    }

    private Properties hibernateProperties() {
        Properties properties = new Properties();
        properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect"));
        properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql"));
        properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql"));
        return properties;
    }

    @Bean
    @Autowired
    public HibernateTransactionManager transactionManager(SessionFactory s) {
        HibernateTransactionManager txManager = new HibernateTransactionManager();
        txManager.setSessionFactory(s);
        return txManager;
    }
}

存储库:

interface UserRepository extends CrudRepository<User, Long> {
}

最佳答案

无需任何其他配置,我就构建了一个示例应用程序,它使用 H2 数据库作为存储,并使用 JpaRepository 来存储和检索用户。

spring-data-jpa-repository-example

只需运行我添加的测试即可。

Mysql 数据库的示例配置:

spring:
  jpa:
    show-sql: true
    hibernate:
      naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy
      dialect: org.hibernate.dialect.MySQL5Dialect
      ddl-auto: create-drop
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/testdb?createDatabaseIfNotExist=true
    test-on-borrow: true
    validation-query: SELECT 1
    username: xxx
    password: xxx

记住将 MySQL 添加到您的类路径中。

希望这有帮助。

贾斯汀

关于java - 使用 spring data jpa 在启动时将数据保存到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38082676/

相关文章:

java - AsyncTask 嵌套类还是自己的类?

按住鼠标按钮时忽略 JavaFX MousedMoved 事件

JAVA:无法在循环中返回响应

spring - 在 Flux react 器中过滤重复对象

spring-mvc - 如何在SpringBootTest中向自动连线的testRestTemplate添加基本身份验证; Spring Boot 1.4

spring - 如何从 <form :select> Spring MVC 传递数据

java - 从 @controller 读取 Spring 配置文件

java - jpanel 背景 魔数(Magic Number)

java - 检查 url 是否等于或者是 的子目录?

java - 如何使resttemplate仅返回与发送的id有关系的类