在SQL查询中使用非提交的值

时间:2014-07-28 16:20:51

标签: java hibernate transactions commit

在某些功能(这里简化)中,我有类似的东西:

public void transfertOrganisms(Organism firstOrganism, Organism secondOrganism){

  firstOrganism.setMetaExercice(DaoHelper.getMaxMetaExercieId("organisme") + 1);
  HibernateUtil.getCurrentSession().saveOrUpdate(firstOrganism);

  secondOrganism.setMetaExercice(DaoHelper.getMaxMetaExercieId("organisme") + 1);
  HibernateUtil.getCurrentSession().saveOrUpdate(secondOrganism);
}

在DaoHelper.java中

public static int getMaxMetaExercieId(String tableName) {
    Query query;
    Session session = HibernateUtil.getSessionFactory().openSession();
    Transaction tx = session.beginTransaction();
    query = session.createSQLQuery("SELECT MAX(META_EXERCICE_ID) FROM " + tableName);
    Integer max = (Integer) query.uniqueResult();
    tx.commit();
    if (max == null)
      return 0;
    return max;
}

现在,由于事务尚未提交,DaoHelper.getMaxMetaExercieId("organisme")将始终返回相同的值。无需管理currentMax(就像创建全局变量一样),有没有办法使用表的非提交值?

1 个答案:

答案 0 :(得分:1)

不幸的是,如果更新Organism表的其他事务可以同时执行(例如,如果应用程序的其他用户正在创建),那么此事务中的这些行的ID只会出现问题有机体同时排队)。我已经为此使用了两种解决方案:使用"自动递增"列(MySQL和MSSQL中的auto_increment);或创建一个包含最大值的表,并在单独的事务中更新该表中的值。