2016-06-28 95 views
1

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

代码:

@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("[email protected]"); 
     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> { 
} 
+0

我与Hibernate发现,做的最好的事情是设置日志级别尽可能高(尽管DEBUG将最有可能做到这一点),并深入研究的输出。日志中经常出现错误或至少提示接下来要尝试的提示。 – JLove

+0

@JLove:让我检查调试模式 –

+0

@JLove:我可以从数据库中读取数据...但保存不工作....它只是返回对象本身,没有任何类型的错误 –

回答

2

没有任何其他的配置,我把一个使用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的添加到类路径。

希望这会有所帮助。

贾斯汀

+0

感谢您的帮助:),但是我可以使用测试代码将数据创建到生产机器吗? –

+0

@PranavCBalan这是生产就绪代码,我刚刚创建它作为Junit测试,以便我不需要设置应用程序的其余部分。请注意我上面有关数据源的评论,如果它解决了你的问题,也会标记为答案。 – JLove

+0

我需要将该数据写入生产服务器 –

0

确保您有commi交易了吗? 或在此处放置'userrepository'代码和spring-data-jpa xml配置。

+0

添加的代码...... –

+0

实体的生命周期由存储库处理,没有明确定义事务,事务的边界将是存储库上的每个方法调用。你不需要提交。 – JLove