【问题标题】:Hiberate: can't reload entity from database休眠:无法从数据库重新加载实体
【发布时间】:2016-01-22 13:57:32
【问题描述】:

我已经在这个问题上苦苦挣扎了几个小时,并且可以得到一些帮助。

  1. 客户端发送一个包含列表的对象;
  2. 列表中的一个对象已在客户端上进行了修改;
  3. 在某些情况下,我不希望将修改后的实体持久化到数据库中,我希望保留原始数据库值。

我已经尝试了以下各种尝试来清除()、刷新()和刷新()会话:

List<Integer> notToModifyIds = dao.getDoNotModifyIds(parentEntity.getId());
MyEntityFromList entityFromClient, entityFromDb;
for(Integer notToModifyId : notToModifyIds){
    ListIterator iterator = parentEntity.getEntities().listIterator();
    while(iterator.hasNext()){
        entityFromClient = (MyEntity) iterator.next();
        if(Objects.equals(entityFromClient.getId(), notToModifyId)){
            dao.evict(entityFromClient);
            entityFromDb = (MyEntity) dao.get(MyEntity.class, notToModifyId);
            iterator.remove(entityFromClient);
            iterator.add(entityFromDb);
        }
    }
}

但是,无论我尝试什么,我总是将来自客户端的值保存到数据库中。当我在iterator.add() 之后添加断点时,我可以检查数据库值在该点是否没有更新,因此我知道如果我可以从数据库加载实体,那么我将拥有我想要的值。

我有点吃不消了!

【问题讨论】:

  • 也许是!这里缺少:if(!Objects.equals(entityFromClient.getId(), notToModifyId))
  • 你能简单地避免修改你不想被持久化的实体吗?
  • @Linuslabo 不,除了被驱逐之外,代码运行正常。
  • @DraganBozanovic 在这种情况下,用户可以修改客户端上的实体,但不应将更改保存到数据库中。
  • 那就不要合并修改过的不应该被持久化的实体。

标签: java hibernate entity


【解决方案1】:

我不知道我是否在这里了解了整个场景。那些修改后的“entitiesFromClient”是否附加到 Hibernate 会话?如果是,则更改可能会在您“驱逐”它们之前自动刷新到数据库中。 设置手动冲洗模式将帮助您避免自动行为。 首先,我将启用 Hibernate SQL 日志记录以更准确地查看正在发生的事情。见Enable Hibernate logging

如果此代码在事务中运行,则在另一个会话中检查数据库(在断点处停止时)将无济于事。即使更改已在数据库中刷新,您也不会在事务提交之前看到它。

【讨论】:

  • 我在开头设置FlushMode.MANUAL,然后在结尾调用dao.flush()。运行几个select 语句,最后创建审计记录并将其写入数据库。然后会更新MyEntity。我没有看到任何意想不到的东西。
  • 嗯......也许它是级联持久化你的实体,因为它仍然在 parentEntity 中被引用。您可以尝试驱逐 parentEntity 吗?我的猜测是因为这个报告的行为:stackoverflow.com/questions/24756443/….
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
相关资源
最近更新 更多