&引用;“状态快照”;Hibernate用于脏检查
我在参考一本关于java持久性和Hibernate的书 (见:) 这本书反复提到“状态快照”——用于脏检查 见: 持久性上下文缓存永远不会自动收缩。保留 将持久性上下文的大小设置为所需的最小值。经常,很多 您的上下文中的持久实例是出于偶然而存在的 例如,因为您只需要少数项,但查询了许多项。 超大图形可能会对性能产生严重影响,并且 状态快照需要大量内存。检查你的 查询只返回需要的数据,并考虑以下方法 控制Hibernate的缓存行为 您可以调用EntityManager#detach(i)来逐出持久实例 从持久性上下文手动执行。你可以打电话 EntityManager#clear()分离所有持久实体实例, 留下一个空的持久性上下文 本机会话API可能有一些额外的操作 有用。您可以将整个持久性上下文设置为只读模式。 这会禁用状态快照和脏检查,而Hibernate不会 写入对数据库的修改:&引用;“状态快照”;Hibernate用于脏检查,hibernate,jpa,Hibernate,Jpa,我在参考一本关于java持久性和Hibernate的书 (见:) 这本书反复提到“状态快照”——用于脏检查 见: 持久性上下文缓存永远不会自动收缩。保留 将持久性上下文的大小设置为所需的最小值。经常,很多 您的上下文中的持久实例是出于偶然而存在的 例如,因为您只需要少数项,但查询了许多项。 超大图形可能会对性能产生严重影响,并且 状态快照需要大量内存。检查你的 查询只返回需要的数据,并考虑以下方法 控制Hibernate的缓存行为 您可以调用EntityManager#detach(i)来逐出持
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。我已经找到了文档,并相应地编辑了我的帖子。链接到与状态快照相关的源代码,这对您来说太棒了!!