2012-01-24 96 views
0

我不确定我对随机类的使用是否正确 - 也许我误解了它。 (但是,我已经多次看到这种用法,但是,在我的Google中)。java:在循环中生成随机数

我试图通过连接一个随机数和一个字符串来生成唯一的发票号码,查找​​数据库中的发票以查看它是否存在,如果确实存在,则创建一个新的发票号码并重试。以下是我的代码,并低于用于测试,而条款的真实性的方法:

String iname = "foo"; 
int sequence = 0; 
String invoice_name = ""; 
Random generator = new Random(); 
do { 
    sequence = generator.nextInt(1000); 
    invoice_name = iname + String.format("%03d", sequence); 
} while(!isUniqueInvoiceName(invoice_name, params, qb) 

// QueryBatch is just a caching mechanism and batch committer for queries 
private boolean isUniqueInvoiceName(String invoice_name, HashMap params, QueryBatch qb) { 
    if(params.get("x_invoice_num") == null) params.put("x_invoice_num",invoice_name); 
    // Invoice.select returns the primary key of the top 1 invoices found, or 0 if none found. 
    int pk = Invoice.select(params, qb); 
    System.out.println("============= pk = " + pk + " ============="); 
    return (pk == 0); 
} 

什么情况是,错误日志显示PK = 13(或东西),然后将它无限地重复该消息。我看不出为什么。是不是正在生成一个新的随机数?或者是select方法返回相同结果而不查看新参数的唯一解释?也许是缓存问题?这是在tomcat/MS SQL上。

+0

考虑使用'java.util.UUID'来生成唯一的'invoice_name's。 – hmjd

回答

2

我认为这个问题是这一行:

if(params.get("x_invoice_num") == null) params.put("x_invoice_num",invoice_name); 

后的第一时间,你设定的x_invoice_num值永远不会为空再次所以它永远不会更新。 我认为你不希望put()是有条件的。

+0

是的,我刚刚意识到这一点,但是这么快就让我回答我自己的问题。不过谢谢!当它让我时,我会给你信用。 – dcoli