重新附加一个未执行 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 实体访问:UserPlayer 是两个实体,它们彼此之间具有 @OneToOne 关系。 User 实体存储在缓存中。我从另一个会话中的缓存中检索了这个实体,我更改了底层 Player 实体并尝试保存它,这给了我异常。

我查看了文档并进行了一些谷歌搜索,发现在调用 save 方法之前我必须重新附加我的实体 (Player)。

使用 JPA 我看到了 refresh 方法,但我不喜欢它,因为它正在从数据库重新加载实体,我不希望实体成为重新加载,因为我知道我的实体没有被修改,如果我使用缓存,这完全是为了避免数据库查询。

使用 Hibernate 我看到 update 方法似乎可以执行我想要的操作,因为即使实体已经持久化,我也可以调用 contains 方法在调用之前检查它update 方法。 但是我想知道 update 方法是访问数据库还是只标记要附加到会话的实体?

我正在寻找的是一种在保存之前自动重新附加我的实体但不重新加载它们的解决方案:我只希望它们处于持久状态。 update 方法是我要找的方法吗?

如果您担心,

Hibernate.update 方法不会访问数据库来检索任何实体信息。它将实体添加到持久上下文(重新附加),然后 HH 将执行更新查询以在您执行刷新或提交底层事务时保存对此跟踪实体的修改。

但要使用它,必须在之前的会话中检索到该实体。您不能将新的 object/entity 实例传递给它。