2012-05-16 119 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