java - Hibernate中什么时候调用flush()和commit()?

标签 java hibernate

我有以下情况:

        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) 将因重复条目错误而失败。但这个错误实际上不会发生,直到在 session.flush() 结束时访问数据库。

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

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

我的 Hibernate 实体与现有数据库架构相反。

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

<property name="hibernate.cache.use_second_level_cache">false</property>
<property name="hibernate.cache.use_query_cache">false</property>   

编辑:

我的问题是如何尽早发现错误(如果有)。错误本身对我来说并不重要。

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

最佳答案

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

这样您就不必更改交易规模。

关于java - Hibernate中什么时候调用flush()和commit()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29737145/

相关文章:

java - 使用 java 在 selenium webdriver 中等待子窗口

java - 如何将数组转换为字符数组?

spring - 使用自定义分隔符通过 spring boot 生成 DDL

java - PostgreSQL 使用 JPA 和 Hibernate 抛出 "column is of type jsonb but expression is of type bytea"

java - 单击按钮时禁用 JTextPane 上的编辑 (Java)

java - Hibernate @ManyToMany -- 未填充连接表

java - MySQL ORDER BY 不适用于数字

java - @ManyToOne,一列可以引用其他两列吗?

java - Hibernate @SQLDelete sql 不添加模式

java - hibernate 配置文件中 session 工厂名称属性的用途是什么