【发布时间】: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