我对Hibernate的理解是,当从DB加载对象时,会将它们添加到Session中。在不同的时候,将根据您的配置刷新会话。此时,已修改的对象将写入数据库。
Hibernate如何确定哪些对象是“脏”对象并需要写入?
Hibernate生成的代理是否会拦截对字段的分配,并将对象添加到Session中的脏列表中?
还是Hibernate查看Session中的每个对象并将其与对象的原始状态进行比较?
还是完全不同的东西?
Hibernate确实/可以使用字节码生成(CGLIB),以便它在您调用setter(甚至分配给字段faict)后立即知道该字段是脏的。
这会立即将该字段/对象标记为脏,但不会减少刷新期间需要进行脏检查的对象的数量。它所做的一切都会影响的实施org.hibernate.engine.EntityEntry.requiresDirtyCheck()。它 仍然 进行逐场比较以检查是否脏污。
org.hibernate.engine.EntityEntry.requiresDirtyCheck()
我说的是以上内容基于最近对源代码(3.2.6GA)进行的跟踪,并添加了任何可信度。兴趣点是:
SessionImpl.flush()
onFlush()
SessionImpl.list()``autoFlushIfRequired()
onAutoFlush()
AbstractFlushingEventListener.flushEverythingToExecutions()
flushEntities()
source.getPersistenceContext().getEntityEntries()
DefaultFlushEntityEventListener.onFlushEntity()
dirtyCheck()