java - 在 SQL 查询中使用非提交值

标签 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 (例如创建全局变量或其他东西),有没有办法使用表的非提交值?

最佳答案

不幸的是,如果更新有机体表的其他事务可以同时执行(例如,如果应用程序有其他用户创建有机体行),那么您不仅会遇到此事务中这些行的 ID 问题同时)。我为此使用了两种解决方案:使用“自动递增”列(MySQL 和 MSSQL 中的 auto_increment);或者创建一个保存最大值的表,并在单独的事务中更新该表中的值。

关于java - 在 SQL 查询中使用非提交值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24999652/

相关文章:

mysql - 事务在 mysql 中不起作用

java - JBoss 部署错误 : Caused by: java. lang.RuntimeException : . application.xml 中列出的 war 模块在 .ear 中不存在

java - 如何通过 HibernateTemplate 更新数据库中的特定字段

java - 测试 Hibernate @Check 约束时无法生成约束违反异常

python - django transaction.commit_manually 导致 'MySQL server has gone away'

php - 交易不适用于子功能

java - 是否有理由使用常量而不是消息?

Java,匿名内部私有(private)接口(interface)的可访问性

java - 搜索 ArrayList 模型

java - 通过@Resource创建bean时出错