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