【问题标题】:Saving data to db on startup using spring data jpa使用spring data jpa在启动时将数据保存到db
【发布时间】:2016-06-28 17:29:31
【问题描述】:

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

代码:

@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("test@test.com");
        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> {
}

【问题讨论】:

  • 我在 Hibernate 中发现最好的办法是将日志级别设置得尽可能高(尽管 DEBUG 很可能会这样做)并彻底研究输出。日志中经常出现错误,或者至少提示下一步要尝试什么。
  • @JLove :让我用调试模式检查一下
  • @JLove :我可以从数据库中读取数据...但保存不起作用...它只是返回对象本身,不会引发任何错误
  • 能否请您发布您的存储库代码以及您的 Hibernate 配置代码。
  • @JLove:好的,我会在几分钟后发帖

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


【解决方案1】:

没有您的任何其他配置,我已经将一个示例应用程序放在一起,它使用 H2 数据库作为存储,以及一个 JpaRepository 来存储和检索用户。

spring-data-jpa-repository-example

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

Mysql DB 配置示例:

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 添加到您的类路径中。

希望这会有所帮助。

贾斯汀

【讨论】:

  • 感谢您的帮助 :),但是我可以使用测试代码将数据创建到生产机器吗?
  • @PranavCBalan 这是生产就绪代码,我刚刚将其创建为 Junit 测试,因此我不需要设置应用程序的其余部分。请注意我上面关于数据源的评论如果解决了您的问题,也将其标记为答案。
  • 我需要将该数据写入生产服务器
  • @PranavCBalan:好的,所以在 application.yaml 中将 H2 内存数据库的配置交换为基于磁盘的数据库。我认为这与您是否可以从存储库中正确存储和检索是一个单独的问题。
  • 我已经修改了我的答案以包含可用于 MySQL 数据库的配置。
【解决方案2】:

确定您已经提交了交易吗? 或者把你的'userrepository'代码和spring-data-jpa xml配置放在这里。

【讨论】:

  • 实体的生命周期由存储库处理,没有明确定义事务,事务的边界将是存储库上的每个方法调用。您不需要提交。
猜你喜欢
  • 2021-09-19
  • 2021-03-05
  • 1970-01-01
  • 2022-01-07
  • 2019-03-31
  • 2018-07-29
  • 1970-01-01
  • 1970-01-01
  • 2015-06-13
相关资源
最近更新 更多