当前位置: 首页 > 面试题库 >

当Hibernate刷新Session时,它如何确定Session中的哪些对象是脏的?

锺离阿苏
2023-03-14
问题内容

我对Hibernate的理解是,当从DB加载对象时,会将它们添加到Session中。在不同的时候,将根据您的配置刷新会话。此时,已修改的对象将写入数据库。

Hibernate如何确定哪些对象是“脏的”并且需要写入?

Hibernate生成的代理是否会拦截对字段的分配,并将对象添加到Session中的脏列表中?

还是Hibernate查看Session中的每个对象并将其与对象的原始状态进行比较?

还是完全不同的东西?


问题答案:

Hibernate确实/可以使用字节码生成(CGLIB),以便它在您调用setter(甚至分配给字段faict)后立即知道该字段是脏的。

这会立即将该字段/对象标记为脏,但不会减少刷新期间需要进行脏检查的对象的数量。它所做的一切都会影响的实施org.hibernate.engine.EntityEntry.requiresDirtyCheck()。它
仍然 进行逐场比较以检查是否脏污。

我说的是以上内容基于最近对源代码(3.2.6GA)进行的跟踪,并添加了任何可信度。兴趣点是:

  • SessionImpl.flush()触发一个onFlush()事件。
  • SessionImpl.list()``autoFlushIfRequired()触发onAutoFlush()事件的呼叫。(在兴趣表上)。也就是说,查询可以调用刷新。有趣的是,如果没有事务,则不会发生刷新。
  • 这两个事件最终都在AbstractFlushingEventListener.flushEverythingToExecutions()结束,在其他有趣的位置结束flushEntities()
  • 循环遍历session(source.getPersistenceContext().getEntityEntries())调用中的每个实体DefaultFlushEntityEventListener.onFlushEntity()
  • 您最终以结束dirtyCheck()。该方法确实对CGLIB脏标志做了一些优化,但是我们仍然最终遍历了每个实体。


 类似资料:
  • 问题内容: 我对Hibernate的理解是,当从DB加载对象时,会将它们添加到Session中。在不同的时候,将根据您的配置刷新会话。此时,已修改的对象将写入数据库。 Hibernate如何确定哪些对象是“脏”对象并需要写入? Hibernate生成的代理是否会拦截对字段的分配,并将对象添加到Session中的脏列表中? 还是Hibernate查看Session中的每个对象并将其与对象的原始状态进

  • 主要内容:示例JSP session 是 javax.servlet.http.HttpSession 的实例对象,主要用来访问用户数据,记录客户的连接信息。 HTTP 协议是一种无状态的协议(即不保存连接状态的协议)。每次用户向服务器发出请求,且服务器接收请求并返回响应后,该连接就被关闭了,服务器端与客户端的连接被断开。此时,服务器端不保留连接的有关信息,要想记住客户的连接信息,就用到了 session 对象

  • session对象用实际上是HttpSession对象实例。用来操作服务端的Session对象。JSP中的Session对象和Servlet中的Session对象基本一样,但有一点不同。就是在默认情况下,每一个JSP页面都会建立一个HttpSession对象。而在Servlet中只有通过调用HttpServletRequest接口的getSession方法时才会建立一个HttpSession对象(

  • 我正在尝试按照Udemy上的教程建立一个电子商务。我正在讨论如何构建购物车功能(如何添加项目,请参阅总成本和数量)的章节。 但是,我在向购物车添加产品时遇到了问题。 属性错误在 /cart/add/4/ “会话存储” 对象没有属性 “会话” 请求方法: GET 请求 URL: http://127.0.0.1:8000/cart/add/4/ Django 版本: 2.1.3 异常类型: 属性错误

  • 问题内容: 是否对原始类使用某种字节码修改? 或者,也许Hibernate通过将给定的对象与以前保留的版本进行比较而得到脏状态? 我在使用复杂对象的和方法时遇到问题。我觉得如果对象具有集合成员,则计算哈希码将非常慢,并且循环引用也是一个问题。 如果Hibernate不使用/ 检查脏状态,我想我不应该将/ 用于实体对象(不是值对象),但是我也担心如果相同的运算符()还不够。 因此,问题是: Hibe