2012-01-24 97 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