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