gpt4 book ai didi

hibernate - grails 中的 "detached"实例是什么?

转载 作者:行者123 更新时间:2023-12-02 14:14:20 24 4
gpt4 key购买 nike

什么是 grails 中的分离实例。 ?

请举例说明。

提前致谢。

最佳答案

当您创建一个新的域类实例(例如 def u = new User(username: 'me') 时,Hibernate 对此一无所知。但是当您持久保存它时,例如当您调用 save() 时,Hibernate 会将插入推送到数据库并将其与当前 hibernate session (不要与 HTTP session 混淆——它们完全不同)。

此外,当您从数据库中单独或作为多个结果列表的一部分加载实例时,您可以访问该实例,但它也与当前 session 相关联。这些对象被“附加”到 session 中。

这在几个方面很有用。一个是作为一级缓存。当您调用 get ,例如def user = User.get(123) ,它被检索并附加。但是,如果您调用 get再次使用相同的 id,它是从缓存中检索的,不需要额外的数据库调用。另一个是脏检查。 Hibernate 还缓存检索到的原始数据,因此当您修改一个或多个字段时,它可以知道哪些(如果有的话)已更改。

对象断开连接的一个问题是延迟加载。在 HTTP session 中存储对象是很常见的,但是一旦 Hibernate session 关闭(例如在请求结束时),所有附加的对象都会被分离。如果你有一个未初始化的惰性加载实例或集合,稍后从 HTTP session 中检索该实例并尝试访问惰性数据,则会导致异常,因为该实例已断开连接,无法连接到数据库以检索懒惰的数据。对此的一种解决方法是将实例重新附加到当前 session - 请参阅 http://grails.org/doc/latest/ref/Domain%20Classes/attach.html .更好的解决方法是不在 session 中存储这样的对象,而是仅存储 id,并在需要时重新加载实例。

关于hibernate - grails 中的 "detached"实例是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18805107/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com