在某些函数(在这里简化)中,我有如下所示:
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 (比如创建一个全局变量或其他东西),有没有一种方法可以使用表的未提交值?
发布于 2014-07-28 18:16:11
不幸的是,如果更新有机物表的其他事务可以同时执行(例如,如果应用程序的其他用户同时创建有机体行),那么这个事务中这些行的id不仅会有问题。为此,我使用了两种解决方案:使用“自动递增”列(auto_increment在MySQL和MSSQL中);或者创建一个保存最大值的表,并在一个单独的事务中更新该表中的值。
https://stackoverflow.com/questions/24999652
复制相似问题