Java 调用循环函数时唯一代码生成失败

Java unique code generation failed while calling the recurring function

我们必须实现一个逻辑来编写 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正在调用一个函数来检查数据库中是否存在代码return对象。我们正在使用 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。但是,递归调用的 return 值不会更新到 code 变量,因此冲突的 code 仍然是 returned 并导致错误。

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

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

这样代码就更新了。 顺便说一句,使用随机数生成唯一值并通过查询来测试唯一性有点奇怪。如果您想要独特的价值,您可以尝试 Auto Increment