我正在使用hibernate 4.1.2
我想在表格中插入一些数据。
我知道可以用这种方式在hibernate配置中用sql实现:
<property name="hibernate.hbm2ddl.import_files" value="/file1.sql,/file2.sql"/>
。
但是,在hibernate启动后,有没有其他方法在Java代码中自动插入一次数据?
我想这样做:
public Role getRoleByName(EnumRole name)
{
return (Role) sessionFactory.getCurrentSession()
.createQuery("from Role where name = :name")
.setParameter("name", name).uniqueResult();
}
public void insertRoles(){
for(EnumRole role:EnumRole.values())
{
Role r=getRoleByName(role);
if(r==null)
{
r=new Role();
r.setName(role);
r.setDescription(role.getDescription());
sessionFactory.getCurrentSession().save(r);
}
}
EnumRole:
public enum EnumRole {
ROLE_CLIENT("РОЛЬ КЛИЕНТА"),
ROLE_ADMIN("РОЛЬ АДМИНСТРАТОРА"),
ROLE_CONSUMER("РОЛЬ КОМПАНЬОНА"),
ROLE_ANONYMOUS("НЕ АВТОРИЗОВАННЫЙ ПОЛЗОВАТЕЛЬ");
EnumRole(String descriptin)
{
this.descriptin=descriptin;
}
public String getDescription()
{
return this.descriptin;
}
private String descriptin;
}
答案 0 :(得分:0)
使用标有insertRoles()
的方法@Transactional
创建服务并致电service.insertRoles()
或者,更简单:
在应用程序启动完成后执行此操作
答案 1 :(得分:0)
您需要使用@PostConstruct
带注释的方法创建任何Spring bean,例如使用PlatformTransactionManager
创建事务:
@Service
public class AnyBean {
@Autowired
private PlatformTransactionManager transactionManager;
@Autowired
private SessionFactory sessionFactory;
@PostConstruct
private void init() {
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
transactionTemplate.execute(new TransactionCallback<Object>() {
@Override
public Object doInTransaction(TransactionStatus transactionStatus) {
// HERE YOU CODE
for(EnumRole role:EnumRole.values())
{
Role r = getRoleByName(role);
if(r==null)
{
r=new Role();
r.setName(role);
r.setDescription(role.getDescription());
sessionFactory.getCurrentSession().save(r);
}
}
return null;
}
});
}
}
我希望这会有所帮助。