Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
Jpa 我的手动刷新()对我的第二个persist()无效_Jpa_Entitymanager_Flush - Fatal编程技术网

Jpa 我的手动刷新()对我的第二个persist()无效

Jpa 我的手动刷新()对我的第二个persist()无效,jpa,entitymanager,flush,Jpa,Entitymanager,Flush,我想测试flush以理解它,并编写了一个代码: -FLUSMODE未处于自动但处于提交模式 -使用express flush()同步数据库 但是,结果并不是我所期望的。 你能看到密码吗。 只有在提交时才会引发异常,而不是在第二次persist()调用时 您将刷新模式设置为提交。所以潮水发生了。。。在提交时。为什么调用persist()时会出现异常?persist()不会提交,所以不会刷新,所以不会向数据库写入任何内容,所以数据库不可能告诉您违反了约束。我不同意。1-因为如果数据库中已经有人(在执

我想测试flush以理解它,并编写了一个代码: -FLUSMODE未处于自动但处于提交模式 -使用express flush()同步数据库

但是,结果并不是我所期望的。 你能看到密码吗。 只有在提交时才会引发异常,而不是在第二次persist()调用时


您将刷新模式设置为提交。所以潮水发生了。。。在提交时。为什么调用persist()时会出现异常?persist()不会提交,所以不会刷新,所以不会向数据库写入任何内容,所以数据库不可能告诉您违反了约束。我不同意。1-因为如果数据库中已经有人(在执行代码之前),代码不会在提交时停止,而是在第一次调用persist()方法时停止。因此,它不会等待提交操作抛出异常。2-我显式调用flush not wait commit操作。如果flush方法()必须等待提交操作,那么将其放入代码中是没有用的。您所说的与您发布的代码中的注释完全矛盾。注释说第一个persist和flush按预期成功,但您预期第二个persist失败,而commit失败。您的问题明确地说,只有在提交时才会抛出异常,而不是在第二次persist()调用时!。这是正常的,因为在我重复的时候,persist()不会刷新,thuse也不会向数据库发送任何内容,因此不会引发任何异常。在第一次持久化之后,flush似乎是正确的,正如它对我说的“数据库中有1条记录”,但第二次持久化之后并没有失败:这是我真正的问题:为什么我必须等待提交操作失败?在我的最后一条评论中,我解释了当我的记录已经在数据库中时,代码可能在第一次持久化(而不是提交)之后立即失败。因此,我们不需要等待提交失败。我真正的问题是理解为什么在我的代码片段中,由于flush似乎有效,我的第二个persist没有立即失败。因此,在调用persist()时,不会向数据库写入任何内容。因此,数据库不可能告诉您存在约束冲突。数据在刷新时写入,而刷新在提交时发生。启用SQL日志记录,一步一步地执行代码,并查看在每个步骤中执行(或未执行)的查询。
EntityManager eMgr = emFactory.createEntityManager();
eMgr.setFlushMode(FlushModeType.COMMIT);

EntityTransaction tx = eMgr.getTransaction();
tx.begin();

    persistPersonne(eMgr);
    eMgr.flush();
    eMgr.clear();
    howManyPersonsInDatabase(eMgr, "after 1st persistence");
    // here, method gives to me : 1 person (correct)
    // (if i do not flush before --> 0 person)

    persistPersonne(eMgr);
    // here, should throw an exception, as my second persist is forbidden 
    // (due to integrity contraint)
    // but NO! --> exception is thrown when commiting..

tx.commit();
// exception is thrown here!!!!!