【问题标题】:JPA Transactional method updates the column after already saving itJPA Transactional 方法在已保存列后更新该列
【发布时间】:2020-09-21 14:44:29
【问题描述】:

我正在保存一个在 REST Webservice 中发布的对象,但我试图在此之前更新一些字段。我有一个 A 类,它的属性是 B(没有关系,只是一个字段 - 由于该字段是一个单独的 JSON 字段/对象,因此很复杂)。我试图在 A 被持久化之前更新 B 的属性,这实际上工作得很好。除了插入新类之后,它还会更新字段。类似的东西:

public class A {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
Long id;

@Lob
@Convert(converter = BConverter.class)
B b_field;
}

public class B {
List<String> someVals;
List<Map<String, String>> amts;
}






@Converter
public class BConverter implements AttributeConverter<B, String> {
    
    private final static ObjectMapper objectMapper = new ObjectMapper();
    
    @Override
    public String convertToDatabaseColumn(B b) {
        try {
            return objectMapper.writeValueAsString(b);
        } catch (JsonProcessingException ex) {....
            return null;
        }
    }
    
    @SneakyThrows
    @Override
    public B convertToEntityAttribute(String bVal) {
        try {
            return objectMapper.readValue(bVal, B.class);
        } catch (IOException ex) {
            ......
            return null;
        }
    }
}

这里是持久化的POST方法:

@Override
@Transactional
public A saveA(A a){
  List<Map<String, String>> amts= new ArrayList<>();
  amts.add(....here goes some hashmap...);
  a.getB_field.setAmts(amts);
  return repository.save(a);
}

触发的查询是:

insert into A (id, b_field) -> here b_field already contains the added values from above
update A set b_field =? where id=?  -> same object that is already inserted. Basically useless

我可以想象它与提交的事务有关,但不明白为什么它没有得到任何更改。有任何想法吗?谢谢!!

【问题讨论】:

  • id 字段是否用@Id 注释?如果是的话,有什么不同吗?
  • 是的,这是A班的。我会更新问题中的注释
  • 你试过用@Id注释Bid吗?
  • B的ID不是ID,它只是一个随机字段。我也可以在示例中更改它。 B 更像是一种结构——就像我说的那样,它很适合 JSON 列
  • 你试过 Vlad Mihalcea 的 hibernate-types project 吗?请参阅:vladmihalcea.com/java-map-json-jpa-hibernate,也许它可以提供任何帮助。

标签: java mysql hibernate jpa persistence


【解决方案1】:

似乎我自己最接近答案,至少现在是这样: 破坏流程的是地图。在 Maps 和 JPA 方面有一些专业,但到目前为止,在这种情况下,它们仍然没有为我工作。 解决方法:如果我创建一个具有已定义字段而不是动态映射的类,则效果很好。
更新:
受@jccampanero 链接的启发,我将 Map 更改为 JsonNode,并正在使用 JsonNodeFactory 动态构建节点。这就像一个魅力!

【讨论】:

    猜你喜欢
    • 2020-02-03
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2017-05-21
    相关资源
    最近更新 更多