【问题标题】:Java unique code generation failed while calling the recurring function调用循环函数时 Java 唯一代码生成失败
【发布时间】:2019-08-20 12:06:09
【问题描述】:

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

这是创建唯一代码的代码

整数代码 = null;

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;
    }

请指导我们找出问题所在。

【问题讨论】:

  • 那么“这个逻辑在某些情况下失败并且我们无法确定问题是什么”会发生什么,有什么例外吗?
  • 例如代码122334代码已经在数据库中,在某些情况下,即使该代码已经存在,系统也会将该代码返回。我们无法确定在哪种情况下允许此代码返回数据库中已存在的相同代码。

标签: java hibernate logic unique-key


【解决方案1】:

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

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

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

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

【讨论】:

  • 但是我们在这里再次在 createCode() 函数本身上初始化代码 code = (int) Math.round(Math.random() * (max - min + 1) + min);跨度>
  • 但是code 没有返回给调用者。请注意code 是局部变量,每次调用都有不同的code
猜你喜欢
  • 2014-04-23
  • 2019-10-06
  • 1970-01-01
  • 2012-05-04
  • 2023-04-06
  • 2020-06-21
  • 1970-01-01
  • 2022-07-20
  • 2016-07-01
相关资源
最近更新 更多