2012-05-16 120 views
1

我有一個用戶列表,我想發送邀請電子郵件給我,在我發送郵件後,我想將該用戶保存在一個單獨的表中,以便服務器進入我們不會發送雙重電子郵件,因爲我們知道誰是我們發送電子郵件的最後一個人。這是代碼:如何將一個jpa對象保存在for循環中

@play.db.jpa.NoTransaction 
public void sendInvite() { 
    Long lastUser = (Long) User.find("select MAX(id) from User").fetch().get(0); 
Long lastId = (Long) Contact.find("select MAX(id) from Contact").fetch().get(0); 

    for (i=lastContacted; i < totalNumUsers; i++) { 
     UserContact contact = new UserContact(); 
     contact.firstName = user.firstName; 
     contact.lastName = user.lastName; 
     contact.email = user.email; 
     if (validateEmail(user) == false) { 
      continue; 
     } 
     sendInviteEmail(user); 
     saveContact(contact); //THIS DOESN'T TAKE PLACE UNTIL END OF THE LOOP 
     Thread.sleep(2000); 
    } 
} 

的問題是,保存的接觸,是沒有得到保存在數據庫中,直到的結束for循環。我曾嘗試:

contact.em().persist(contact); 
contact.em().flush(); 

,但不工作或者
*我也想補充一點,方法正在從工作,而不是從控制器上運行。

回答

2

如果你在事務中做了所有這些事情,並且服務器關閉了,事務將不會被提交,並且即使在事務處理期間刷新,也不會寫入數據庫。敵人每個聯繫人,你需要打開一個新的交易,保存聯繫人在這個新的交易,然後提交交易。

+0

我也爲該方法設置了註釋@ play.db.jpa.NoTransaction,但它並不妨礙播放在事務中運行它。值得注意的是該方法在Job中運行,而不是從Controller中運行 – nightograph

+0

問題不在於所有這些都在事務中運行。問題是每個聯繫人創建應該在自己的事務中。 –

+0

我很欣賞一個例子,我如何在已定義的事務中創建單獨的事務? – nightograph