【问题标题】:Insert Data only once after Hibernate startedHibernate 启动后只插入一次数据
【发布时间】:2013-07-31 19:05:10
【问题描述】:

我使用的是休眠 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;
}

【问题讨论】:

    标签: java spring hibernate enums


    【解决方案1】:

    您需要使用 @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;
          }
        });
      }
    }
    

    我希望这会有所帮助。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-04
        • 1970-01-01
        • 1970-01-01
        • 2021-05-02
        相关资源
        最近更新 更多