【发布时间】: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注释B的id吗? -
B的ID不是ID,它只是一个随机字段。我也可以在示例中更改它。 B 更像是一种结构——就像我说的那样,它很适合 JSON 列
-
你试过 Vlad Mihalcea 的
hibernate-typesproject 吗?请参阅:vladmihalcea.com/java-map-json-jpa-hibernate,也许它可以提供任何帮助。
标签: java mysql hibernate jpa persistence