【问题标题】:Map.remove("x") removes from relevant "x" in Postgres Json columnMap.remove("x") 从 Postgres Json 列中的相关“x”中删除
【发布时间】:2022-01-19 10:09:29
【问题描述】:

我正在从 Postgres DB 读取数据,然后我需要从红色数据中删除一部分 JSON 数据。但这会对数据库级别产生影响,因为这甚至会从数据库级别删除数据。

删除方法

private static Map<String,Object> removePrivate(Object key) {
        try {
            Map<String, Object> keyMap = (Map<String, Object>) key;
            keyMap.remove("d");
            return keyMap;
        } catch (Exception ex) {
            log.warn("no private component 'd' in private key",ex);
            return null;
        }
    }

这里使用remove方法。

public List<Key> getKeys(URI controller, URI url, String type, String purpose, String reference, Long limit, boolean exportPrivate) {

        List<Key> keyList = new ArrayList<>();
        List<com.xxx.model.Key> keys = keyRepository.getKeys(controller, url, type, purpose, reference, limit);
        if (keys == null || keys.isEmpty()) throw new BadRequestException("No keys found for given settings");
        keys.forEach(key -> {
            try {
                Key k = modelMapper.map(key, Key.class);
                keyList.add(k);
            } catch (Exception e) {
                log.error("Parse exception {}", e.getMessage(),e);
                throw new BadRequestException("Invalid key format",e);
            }
        });

        if (!exportPrivate) keyList.forEach(key -> key.setKey(removePrivate(key.getKey())));
        return keyList;
    }

是否有任何明确的原因为什么从地图中删除属性“d”会对数据库级别产生影响,并且它也会从“keys”列表中删除“d”组件,但它应该只从“keyList”列表中删除.

【问题讨论】:

  • 你在使用像 Hibernate 这样的框架吗?保存数据?
  • @Bruno 是的,我正在使用 Spring Data JPA
  • 不清楚您的 modelMapper 做了什么,但它可能会保留对 Map 的引用,然后您稍后会保存它,影响存储在数据库中的数据。
  • 附带说明,您对类名和变量名的选择令人困惑。首先,你有一个key.getKey(),所以一个“key”显然也包含一个名为“key”的字段,它似乎是Map&lt;String, Object&gt;类型,然后与Maps的一般术语冲突(其中key/值有自己的含义)。从本质上讲,在这个简短的代码示例中,“key”这个词似乎意味着至少 3 种不同的东西......
  • 如果您稍后要保留该实体,您所要做的就是复制列表并在 getKeys 中修改它,而不是在原始列表上操作。

标签: java spring postgresql spring-boot linkedhashmap


【解决方案1】:

问题的原因是@Trasactional。当我删除此问题时,问题已删除。 但如果有人能解释一下@Trasactional 是如何导致这样的问题的,那就太好了。

【讨论】:

  • 这可能是因为@Transactional 会使其在您的方法结束时提交,否则它不会自动提交(这可能取决于其他设置)。使用@Transactional 进行只读操作也是一件好事(取决于此代码中您需要的事务/ACID 属性)。您可能应该查看是什么保留了对已加载数据的引用并检查它的保存位置(何时不应该)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 2015-05-05
  • 2017-12-06
  • 1970-01-01
  • 1970-01-01
  • 2023-02-16
  • 2020-06-05
相关资源
最近更新 更多