重新附加一个未执行 SQL 查询的分离实体
re-attach a detached entity with no SQL query executed
我有许多具有关系的实体(@OneToMany
、@ManyToOne
和 @OneToOne
),出于优化目的,我将加载的实体存储在 Cache
中(使用 Play Framework
缓存).
缓存存储和检索正确完成,但是当我尝试保存实体时出现以下异常:detached entity passed to persist: models.Player
我试图保存的实体 (Player
) 未存储在缓存中,而是从缓存中的 User
实体访问:User
和 Player
是两个实体,它们彼此之间具有 @OneToOne
关系。 User
实体存储在缓存中。我从另一个会话中的缓存中检索了这个实体,我更改了底层 Player
实体并尝试保存它,这给了我异常。
我查看了文档并进行了一些谷歌搜索,发现在调用 save
方法之前我必须重新附加我的实体 (Player
)。
使用 JPA
我看到了 refresh
方法,但我不喜欢它,因为它正在从数据库重新加载实体,我不希望实体成为重新加载,因为我知道我的实体没有被修改,如果我使用缓存,这完全是为了避免数据库查询。
使用 Hibernate
我看到 update
方法似乎可以执行我想要的操作,因为即使实体已经持久化,我也可以调用 contains
方法在调用之前检查它update
方法。
但是我想知道 update
方法是访问数据库还是只标记要附加到会话的实体?
我正在寻找的是一种在保存之前自动重新附加我的实体但不重新加载它们的解决方案:我只希望它们处于持久状态。 update
方法是我要找的方法吗?
如果您担心,Hibernate.update
方法不会访问数据库来检索任何实体信息。它将实体添加到持久上下文(重新附加),然后 HH 将执行更新查询以在您执行刷新或提交底层事务时保存对此跟踪实体的修改。
但要使用它,必须在之前的会话中检索到该实体。您不能将新的 object/entity 实例传递给它。
我有许多具有关系的实体(@OneToMany
、@ManyToOne
和 @OneToOne
),出于优化目的,我将加载的实体存储在 Cache
中(使用 Play Framework
缓存).
缓存存储和检索正确完成,但是当我尝试保存实体时出现以下异常:detached entity passed to persist: models.Player
我试图保存的实体 (Player
) 未存储在缓存中,而是从缓存中的 User
实体访问:User
和 Player
是两个实体,它们彼此之间具有 @OneToOne
关系。 User
实体存储在缓存中。我从另一个会话中的缓存中检索了这个实体,我更改了底层 Player
实体并尝试保存它,这给了我异常。
我查看了文档并进行了一些谷歌搜索,发现在调用 save
方法之前我必须重新附加我的实体 (Player
)。
使用 JPA
我看到了 refresh
方法,但我不喜欢它,因为它正在从数据库重新加载实体,我不希望实体成为重新加载,因为我知道我的实体没有被修改,如果我使用缓存,这完全是为了避免数据库查询。
使用 Hibernate
我看到 update
方法似乎可以执行我想要的操作,因为即使实体已经持久化,我也可以调用 contains
方法在调用之前检查它update
方法。
但是我想知道 update
方法是访问数据库还是只标记要附加到会话的实体?
我正在寻找的是一种在保存之前自动重新附加我的实体但不重新加载它们的解决方案:我只希望它们处于持久状态。 update
方法是我要找的方法吗?
Hibernate.update
方法不会访问数据库来检索任何实体信息。它将实体添加到持久上下文(重新附加),然后 HH 将执行更新查询以在您执行刷新或提交底层事务时保存对此跟踪实体的修改。
但要使用它,必须在之前的会话中检索到该实体。您不能将新的 object/entity 实例传递给它。