在我的应用程序中,我有一个名为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_PROFILE
和USER
。
春天怎么做?我在没有XML文件的情况下使用它来配置所有内容。
答案 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会话,则可以这样做。