2013-07-31 23 views
0

我正在使用休眠4.1.2休眠开始后只插入一次数据

我想插入一些数据到表中。

我知道它可以用这种方式在休眠配置中的sql实现:
<property name="hibernate.hbm2ddl.import_files" value="/file1.sql,/file2.sql"/>

但是,有没有其他方法在休眠启动后在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

您需要使用@PostConstruct注释方法创建任何Spring bean,例如使用创建事务:

@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; 
     } 
    }); 
    } 
} 

我希望这对我有所帮助。

0

创建带有标注@Transactional方法insertRoles()服务和呼叫service.insertRoles()
或者,更容易:

  1. 创建事务
  2. 添加角色
  3. 提交(或管理回滚,如果出现错误)

您的应用程序的启动已经完成

后做这个东西