gpt4 book ai didi

java - 重新附加未执行 SQL 查询的分离实体

转载 作者:行者123 更新时间:2023-12-01 11:21:21 25 4
gpt4 key购买 nike

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

缓存存储和检索正确完成,但是当我尝试保存实体时,出现以下异常:分离的实体传递给持久:models.Player

我尝试保存的实体 (Player) 未存储在缓存中,而是从缓存中的 User 实体进行访问:UserPlayer 是两个实体,它们彼此之间具有 @OneToOne 关系。 User 实体存储在缓存中。我从另一个 session 中的缓存中检索了该实体,并更改了底层的 Player 实体并尝试保存它,这给了我异常(exception)。

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

使用JPA,我看到了refresh方法,但我不喜欢它,因为它正在从数据库重新加载实体,并且我不想要该实体重新加载,因为我知道我的实体尚未修改,并且如果我使用缓存,这正是为了避免数据库查询。

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

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

最佳答案

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

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

关于java - 重新附加未执行 SQL 查询的分离实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31190601/

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