调用重复函数时,Java 唯一代码生成失败



我们必须实现一个逻辑来编写Java中的唯一代码生成。这个概念是当我们生成代码时,系统将检查代码是否已经生成。如果已经生成系统,请创建新代码并再次检查。但是这种逻辑在某些情况下会失败,我们无法确定问题是什么

这是创建唯一代码

的代码整数代码 = 空;

try {
int max = 999999;
int min = 100000;
code = (int) Math.round(Math.random() * (max - min + 1) + min);
PreOrders preObj = null;
preObj = WebServiceDao.getInstance().preOrderObj(code.toString());
if (preObj != null) {
createCode();
}
} catch (Exception e) {
exceptionCaught();
e.printStackTrace();
log.error("Exception in method createCode() - " + e.toString());
}
return code;

}

函数preOrderObj调用函数来检查数据库中是否存在代码(如果存在(,则返回对象。我们使用Hibernate在后端映射数据库函数和Mysql。

这是函数preOrderObj

PreOrders preOrderObj = null;
List<PreOrders> preOrderList = null;
SessionFactory sessionFactory =
(SessionFactory) ServletActionContext.getServletContext().getAttribute(HibernateListener.KEY_NAME);
Session Hibernatesession = sessionFactory.openSession();
try {
Hibernatesession.beginTransaction();
preOrderList = Hibernatesession.createCriteria(PreOrders.class).add(Restrictions.eq("code", code)).list(); // removed .add(Restrictions.eq("status", true))
if (!preOrderList.isEmpty()) {
preOrderObj = (PreOrders) preOrderList.iterator().next();
}
Hibernatesession.getTransaction().commit();
Hibernatesession.flush();
} catch (Exception e) {
Hibernatesession.getTransaction().rollback();
log.debug("This is my debug message.");
log.info("This is my info message.");
log.warn("This is my warn message.");
log.error("This is my error message.");
log.fatal("Fatal error " + e.getStackTrace().toString());
} finally {
Hibernatesession.close();
}
return preOrderObj;
}

请指导我们确定问题。

createCode方法中,当生成的随机代码已经存在于数据库中时,您尝试再次调用createCode。但是,递归调用的返回值不会更新为code变量,因此仍会返回冲突code并导致错误。

若要解决此问题,请将方法更新为

...
if (preObj != null) {
//createCode();
code = createCode();
}  
...

以便更新代码。 顺便说一句,使用随机数通过查询生成唯一值并测试唯一性有点奇怪。如果您想要唯一值,您可以尝试自动增量。

最新更新