0

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

枚举角色:

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;
}
4

2 回答 2

0

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

  1. 创建交易
  2. 添加角色
  3. 提交(或在发生错误时管理回滚)

在您的应用程序启动完成后执行此操作

于 2013-07-31T19:13:11.493 回答
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;
      }
    });
  }
}

我希望这会有所帮助。

于 2013-07-31T20:07:42.153 回答