在某些功能(这里简化)中,我有类似的东西:
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(就像创建全局变量一样),有没有办法使用表的非提交值?
答案 0 :(得分:1)
不幸的是,如果更新Organism表的其他事务可以同时执行(例如,如果应用程序的其他用户正在创建),那么此事务中的这些行的ID只会出现问题有机体同时排队)。我已经为此使用了两种解决方案:使用"自动递增"列(MySQL和MSSQL中的auto_increment
);或创建一个包含最大值的表,并在单独的事务中更新该表中的值。