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()(结束事务)。