&引用;“状态快照”;Hibernate用于脏检查

&引用;“状态快照”;Hibernate用于脏检查,hibernate,jpa,Hibernate,Jpa,我在参考一本关于java持久性和Hibernate的书 (见:) 这本书反复提到“状态快照”——用于脏检查 见: 持久性上下文缓存永远不会自动收缩。保留 将持久性上下文的大小设置为所需的最小值。经常,很多 您的上下文中的持久实例是出于偶然而存在的 例如,因为您只需要少数项,但查询了许多项。 超大图形可能会对性能产生严重影响,并且 状态快照需要大量内存。检查你的 查询只返回需要的数据,并考虑以下方法 控制Hibernate的缓存行为 您可以调用EntityManager#detach(i)来逐出持

我在参考一本关于java持久性和Hibernate的书

(见:)

这本书反复提到“状态快照”——用于脏检查

见:

持久性上下文缓存永远不会自动收缩。保留 将持久性上下文的大小设置为所需的最小值。经常,很多 您的上下文中的持久实例是出于偶然而存在的 例如,因为您只需要少数项,但查询了许多项。 超大图形可能会对性能产生严重影响,并且 状态快照需要大量内存。检查你的 查询只返回需要的数据,并考虑以下方法 控制Hibernate的缓存行为

您可以调用EntityManager#detach(i)来逐出持久实例 从持久性上下文手动执行。你可以打电话 EntityManager#clear()分离所有持久实体实例, 留下一个空的持久性上下文

本机会话API可能有一些额外的操作 有用。您可以将整个持久性上下文设置为只读模式。 这会禁用状态快照和脏检查,而Hibernate不会 写入对数据库的修改:

em.unwrap(Session.class).setDefaultReadOnly(true)

Item Item=em.find(Item.class,Item\u ID)

item.setName(“新名称”)

em.flush()

因此,我的问题是:

  • Hibernate从
    @实体
    类创建的代理对象与上面提到的状态快照之间有什么区别

  • 在哪里可以找到有关这些状态快照的进一步文档

编辑:考虑到Naros的回答,我在hibernate文档中找到了会话类的非常有趣的信息:
Session\setDefaultReadOnly

更改加载到此会话中的实体和代理的默认值 从可修改到只读模式,或从可修改到只读模式 模式只读实体未进行脏检查,并且 持久状态不被维护。可以创建只读实体 已修改,但更改不会持久化。初始化代理时, 加载的实体将具有与相同的只读/可修改设置 未初始化的代理具有,无论会话的当前 背景要更改特定对象的只读/可修改设置 已在此会话中的实体或代理


这里是链接:

区别在于它们代表什么。加载到持久性上下文中的任何对象几乎总是加载一些状态快照,无论它们是标识符还是仅加载非延迟属性

当实体加载到持久性上下文中时,实体数据库列的值将存储在称为状态快照的对象数组中。它在数据库级别表示实体的状态,稍后当用户在事务的整个生命周期中更改实体对象的状态时,我们可以使用它,例如执行脏检查


另一方面,代理代表封装标识符的占位符。它确实维护一些状态快照,通常是标识符,但它不是完整的数据库行,因此,不能也不会对代理实例执行脏检查。

区别在于它们所代表的内容。加载到持久性上下文中的任何对象几乎总是加载一些状态快照,无论它们是标识符还是仅加载非延迟属性

当实体加载到持久性上下文中时,实体数据库列的值将存储在称为状态快照的对象数组中。它在数据库级别表示实体的状态,稍后当用户在事务的整个生命周期中更改实体对象的状态时,我们可以使用它,例如执行脏检查


另一方面,代理代表封装标识符的占位符。它确实维护一些状态快照,通常是标识符,但它不是完整的数据库行,因此,不能也不会对代理实例执行脏检查。

非常感谢Naros。您能给我指一下文档中提到您所解释的内容的相关部分吗?或者更好的是指负责管理状态快照的hibernate类的源代码?您好,Naros。我已经找到了文档,并相应地编辑了我的帖子。链接到与状态快照相关的源代码,这对您来说太棒了!!非常感谢,纳罗斯。您能给我指一下文档中提到您所解释的内容的相关部分吗?或者更好的是指负责管理状态快照的hibernate类的源代码?您好,Naros。我已经找到了文档,并相应地编辑了我的帖子。链接到与状态快照相关的源代码,这对您来说太棒了!!