在Hibernate启动后仅插入一次数据

时间:2013-07-31 19:05:11

标签: java spring hibernate enums

我正在使用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;
}

2 个答案:

答案 0 :(得分:0)

使用标有insertRoles()的方法@Transactional创建服务并致电service.insertRoles() 或者,更简单:

  1. 创建交易
  2. 添加角色
  3. 提交(或在发生错误时管理回滚)
  4. 在应用程序启动完成后执行此操作

答案 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;
      }
    });
  }
}

我希望这会有所帮助。