在某些函数(此处简化)中,我有这样的东西:
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/