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

当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对象(

  • 问题内容: 我看到lambda的类是,但是我认为对于代理类而言可能同样如此。 当然,我可以检查一下并应用于类名。 但是我想知道是否有一个更优雅,更强大的选项来确定给定的对象是否为lambda。 问题答案: 设计上没有官方的方法可以做到这一点。Lambda是语言的一部分;并通过功能接口集成到类型系统中。无需区分以lambda,命名类或内部类开头的生命,它们都是Runnable。如果您认为必须拆开类文

  • 问题内容: 我有三个类(,和),它们扩展了另一个类()。如何判断对象属于哪个子类?到目前为止,我有一个具有类名称的属性,但是我认为可以使用类似于javascript的typeof的运算符。(类似:) 问题答案: 您可以使用关键字。 但是请注意,需要使用它通常是不良设计的标志。通常,您应该在每个派生类中编写方法覆盖,以便您无需显式地检查是哪个类。

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