Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.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 在Hibernate中何时调用flush()和commit()?_Java_Hibernate - Fatal编程技术网

Java 在Hibernate中何时调用flush()和commit()?

Java 在Hibernate中何时调用flush()和commit()?,java,hibernate,Java,Hibernate,我有以下情况: openSession() tx = session.beginTransaction(); try { ... session.saveOrUpdate(obj_1); ... session.saveOrUpdate(obj_2); ... session.saveOrUpdate(obj_3); session

我有以下情况:

        openSession()

        tx = session.beginTransaction();

    try
    {
        ...
        session.saveOrUpdate(obj_1);
        ...
        session.saveOrUpdate(obj_2);
        ...
        session.saveOrUpdate(obj_3);

        session.flush();
        tx.commit();
    }
    catch()
    {
       tx.rollback()
    }
    finally
    {
        session.close();
    }
由于重复输入错误,saveOrUpdate(obj_1)的第一次调用将失败。但是,在会话结束时访问数据库之前,实际上不会发生此错误。flush()

有没有办法让这种错误尽早发生,让我有更多的机会正确处理它

我也不想把事务削减得太小,因为它很难回滚

我的Hibernate实体与现有数据库模式相反

我已禁用配置文件中的缓存:

<property name="hibernate.cache.use_second_level_cache">false</property>
<property name="hibernate.cache.use_query_cache">false</property>   
false
假的
编辑:

我的问题是,如果有错误,我如何才能尽早得到错误。这个错误对我来说并不重要


现在,错误发生在最后,但实际上是在第一次访问时发生的。

您可以在每次
会话后执行
会话.flush()
。saveOrUpdate
以强制hibernate在数据库上执行更新或插入。如果没有flush命令,实际的数据库操作将被延迟,并且只会在事务结束之前立即处理


这样,您就不必更改事务的大小。

您可以在每次会话后执行Surendran。saveOrUpdate可强制hibernate在数据库上执行更新或插入。如果没有flush命令,实际的数据库操作将被延迟,并且只会在事务结束之前立即处理


这样,您就不必更改事务的大小。

hello@5YrsLaterDBA您在这里是否遇到了一些错误,如果是,请在您的问题中包含堆栈跟踪,这将非常有助于确定错误的实际原因。我不是问如何避免错误。所以错误信息在这里是不相关的。我要问的是如何使Hibernate尽早抛出错误,我可以尽早处理它。好的,正如您在问题中所说的“由于重复输入错误,第一次调用saveOrUpdate(obj_1)将失败。但是,在会话结束时访问数据库之前,实际上不会发生此错误。flush()但根据我的实践知识,如果您将任何字段定义为唯一约束,并且由于某些原因,它被违反,您将得到org.hibernate.hibernateeexception,而session.saveorupdate这可能是解决方案。但是这个频繁的flush()调用的缺点是什么?一级缓存或二级缓存降级?我测试过,我知道flush()实际上不会触及物理数据库。您是如何测试对物理数据库的访问的?没有提交,所以在使用任何查询工具时都看不到任何更改。这就是为什么我说flush()在调用tx.commit()之前不会更新物理数据库。如果有错误,flush()会导致错误,所以我认为Hibernate肯定在某个地方做了什么。它必须是缓存之一,然后.flush()会导致执行sql操作,如果出现错误,它会从基础数据库中获取错误代码。这确实会更改数据库,但此更改仅在当前会话中可见,除非隔离级别为READ_UNCOMMITTED。因此,更改全局数据库状态有两个步骤:flush()(执行插入或更新)和commit()(结束事务)。