重新附加没有执行SQL查询的分离实体

时间:2015-07-02 17:02:53

标签: java hibernate jpa playframework

我有很多具有关系的实体(@OneToMany@ManyToOne@OneToOne),出于优化目的,我将加载的实体存储在Cache中(使用{{1}缓存)。

缓存存储和检索正确完成但是当我尝试保存实体时,我遇到以下异常:Play Framework

我正在尝试保存的实体(detached entity passed to persist: models.Player)未存储在缓存中,但可以从缓存中的Player实体访问:UserUser是两个实体,彼此之间有Player个关系。 @OneToOne实体存储在缓存中。我在另一个会话中从缓存中检索了这个实体,并且我更改了基础User实体并尝试保存它,这给了我的例外。

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

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

使用refresh我看到Hibernate方法似乎做了我想做的事情,即使实体已经是持久性的我也可以在调用{之前调用update方法进行检查{1}}方法。 但是,我想知道contains方法是访问数据库还是仅标记要附加到会话的实体?

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

1 个答案:

答案 0 :(得分:1)

如果您担心这个问题,

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

但要使用它,必须在之前的会话中检索该实体。您无法将新对象/实体实例传递给它。