Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.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 当使用FlushMode.AUTO调用session.close()时,Hibernate会刷新我更新的持久对象吗?_Java_Hibernate_Session_Flush - Fatal编程技术网

Java 当使用FlushMode.AUTO调用session.close()时,Hibernate会刷新我更新的持久对象吗?

Java 当使用FlushMode.AUTO调用session.close()时,Hibernate会刷新我更新的持久对象吗?,java,hibernate,session,flush,Java,Hibernate,Session,Flush,如果设置了FlushMode.AUTO,当我调用session.close()时,是否会休眠刷新更新的持久对象 我知道session.close()通常不会刷新会话,但我不确定FlushMode.AUTO会如何影响它 从文档中: 刷新模式。自动 有时会在执行查询之前刷新会话,以确保查询永远不会返回过时状态。这是默认的刷新模式 这是否意味着我可以依靠Hibernate来验证我的更改是否在会话关闭之前被刷新 小代码示例: Session session = HibernateSessionFacto

如果设置了FlushMode.AUTO,当我调用session.close()时,是否会休眠刷新更新的持久对象

我知道session.close()通常不会刷新会话,但我不确定FlushMode.AUTO会如何影响它

从文档中:

刷新模式。自动
有时会在执行查询之前刷新会话,以确保查询永远不会返回过时状态。这是默认的刷新模式

这是否意味着我可以依靠Hibernate来验证我的更改是否在会话关闭之前被刷新

小代码示例:

Session session = HibernateSessionFactory.getSession();  
PersistedObject p = session.get(PersistedObject.class,id);  
p.setSomeProperty(newValue);  
session.close();
更新
根据这些位置,会话将刷新(使用AUTO时)

  • 在执行某些查询之前
  • 来自org.hibernate.Transaction.commit()
  • 从Session.flush()开始

这并不是说会话。close()

关闭会话将始终将所有工作刷新到数据库中。Flushmode.AUTO在发生更改并且您正在使用更改的记录查询表时,将工作刷新到数据库

调用session.close()时(使用FlushMode.AUTO),Hibernate会刷新我更新的持久对象吗

不,不会,您应该使用具有明确边界的事务。引述:

使用Hibernate进行非事务性工作 请看下面的代码,其中 访问数据库时不使用 交易边界:

Session session = sessionFactory.openSession(); 
session.get(Item.class, 123l); 
session.close(); 
默认情况下,在JavaSE环境中 对于JDBC配置,这是 如果执行此操作会发生什么 片段:

  • 将打开一个新会话。此时无法获取数据库连接 重点
  • 对get()的调用触发SQL选择。会话现在获得一个JDBC 来自连接池的连接。 默认情况下,立即休眠 关闭此服务器上的自动提交模式 与setAutoCommit的连接(错误)。 这实际上启动了一个JDBC 成交
  • SELECT在这个JDBC事务中执行。会议正在进行中 关闭,然后返回连接 到池中并由Hibernate释放 -Hibernate在JDBC上调用close() 连接。这辆车怎么了 未提交的交易
  • 这个问题的答案是:“它 取决于JDBC规范 没有说任何关于未决的事情 调用close()时的事务 联系。发生什么取决于 供应商如何实施 规范。使用oraclejdbc 驱动程序,例如,调用 close()提交事务!最 其他JDBC供应商采取了明智的做法 并回滚任何挂起的事务 当JDBC连接对象是 已关闭,资源将返回到 游泳池

    显然,这对我们来说不是问题 您已执行的选择,但请看 在这种变化下:

    Session session = getSessionFactory().openSession(); 
    Long generatedId = session.save(item); 
    session.close(); 
    
    此代码导致插入 语句,在 从未提交或删除的事务 向后滚。在甲骨文上,这篇文章 代码永久插入数据;在里面 其他数据库,它可能不会。(本 情况稍有好转 复杂:执行插入 仅当标识符生成器 需要它。例如,一个 标识符值可以从 没有插入的序列。 然后将持久实体排队,直到 刷新时间插入-从不 在此代码中发生。标识 战略需要立即插入 对于要生成的值。)


    底线:使用明确的事务划分。

    谢谢您的回答。你能给这句话附上一些参考资料吗?我已经在网上读了两篇关于这一点的帖子,这让我很困惑(因此我的问题),我希望能链接到一个经过认证的Hibernate源代码。好吧,我不是完全正确。如果您正在使用事务,则提交将刷新。如果没有活动的事务,所有更改都会直接传播到数据库(每个会话方法调用一个事务)true,因为我的经验是不幸的oracle 9数据库)我刚刚从您在另一个问题中给我的链接中完成了这篇文章,返回这里,刷新并查看它。你当然是对的,非常感谢你为我澄清了这个重要的话题。