如何在应用程序启动时将值(users和users_profiles)加载到数据库?

时间:2016-02-28 04:14:19

标签: java sql spring hibernate

在我的应用程序中,我有一个名为HibernateConfiguration.java的文件,它具有主数据库配置,并使用下面的代码摘录我设法在应用程序启动时创建表:

   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"));
        properties.put("hibernate.hbm2ddl.auto", environment.getRequiredProperty("hibernate.hbm2ddl.auto"));
        return properties;        
    }

现在我想在Hibernate创建表之后填充一些表。目前,在访问应用程序之前,我必须运行一个sql脚本来填充USER_PROFILEUSER

春天怎么做?我在没有XML文件的情况下使用它来配置所有内容。

1 个答案:

答案 0 :(得分:0)

如果您想在开始时填充表格,最简单的方法是使用@PostConstruct注释。实际上,你可以用它来标记配置方法,但我更喜欢创建单独的bean:

public class DataInitializer {

    @Autowired
    private UserRepository userRepository;

    @PostConstruct
    public void populate(){
        User user = new User();
        //set user props ...
        userRepository.save(user);
    }
}

现在只需将此组件注册到配置中(如果使用组件扫描,则使用@Component标记此类):

@Configuration
public class AppConfig{
    ...

    @Bean
    public DataInitializer createDataInitializer(){
        return new DataInitializer();
    }
}

我不知道您是否使用JPA存储库。但是,如果您直接使用EntityManager,请注意,您无法在@Transactional上使用@PostConstruct注释。在这种情况下,您必须使用TransactionTemplate

public class DataInitializer {

    @PersistenceContext
    private EntityManager manager;
    @Autowired
    private PlatformTransactionManager txManager;


    @PostConstruct
    public void populate(){

        TransactionTemplate template = new TransactionTemplate(txManager);
        template.execute(new TransactionCallback<Object>() {
            @Override
            public Object doInTransaction(TransactionStatus transactionStatus) {
                User user = new User();
                //set user props ...
                manager.merge(user);
                return null;
            }
        });
    }
}

如果您使用Hibernate会话,则可以这样做。