Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在for循环中保存jpa对象_Java_Jpa_Playframework - Fatal编程技术网

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();