Java 如何在for循环中保存jpa对象
我有一个用户列表,我想向其发送邀请电子邮件,在我发送电子邮件后,我想将此人保存在一个单独的表中,以便万一服务器出现故障,我们不会发送双重电子邮件,因为我们知道我们最后发送电子邮件的人是谁。代码如下:Java 如何在for循环中保存jpa对象,java,jpa,playframework,Java,Jpa,Playframework,我有一个用户列表,我想向其发送邀请电子邮件,在我发送电子邮件后,我想将此人保存在一个单独的表中,以便万一服务器出现故障,我们不会发送双重电子邮件,因为我们知道我们最后发送电子邮件的人是谁。代码如下: @play.db.jpa.NoTransaction public void sendInvite() { Long lastUser = (Long) User.find("select MAX(id) from User").fetch().get(0); Long lastId = (
@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);
}
}
但这也不起作用*我还想补充一点,该方法是从作业运行的,而不是从控制器运行的。如果在事务中执行所有这些操作,并且服务器停机,则事务将不会提交,即使在事务期间刷新,也不会向数据库写入任何内容。对于每个联系人,您都需要打开一个新事务,将联系人保存在此新事务中,然后提交该事务。我还为该方法设置了注释@play.db.jpa.NoTransaction,但它不会阻止该播放在事务中运行它。值得注意的是,该方法是在作业中运行的,而不是来自控制器。问题不是所有这些都在事务中运行。问题是,每个联系人的创建都应该在自己的事务中。我很欣赏一个例子,如何在已定义的事务中创建单独的事务?我不太了解Play,但根据这篇文章,您需要明确地这样做:。
contact.em().persist(contact);
contact.em().flush();