我有一个用户列表,我想发送邀请电子邮件,在我发送电子邮件之后,我想将该人保存在一个单独的表中,因此,如果服务器关闭,我们将不会发送双重电子邮件我们知道谁是我们发送电子邮件的最后一个人。这是代码:
@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();
但这也不起作用 *我还想补充说,该方法是从Job运行而不是从Controller运行。
答案 0 :(得分:2)
如果您在事务中执行了所有这些操作,并且服务器关闭,则不会提交事务,即使您在事务期间刷新,也不会将任何内容写入数据库。对于每个联系人,您需要打开一个新事务,保存此新事务中的联系人,然后提交事务。