java - JPA Transactional 方法在已保存列后更新该列
问题描述
我保存了一个在 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
我可以想象它与提交的交易有关,但不明白为什么它没有得到任何改变。有任何想法吗?谢谢!!
解决方案
似乎我自己最接近答案,至少现在是这样:是地图打破了流程。在 Maps 和 JPA 方面有一些专长,但在这种情况下,它们至今都没有为我工作。解决方法:如果我创建一个具有已定义字段而不是动态映射的类,则效果很好。
更新:
受@jccampanero 链接的启发,我将 Map 更改为 JsonNode,并正在使用 JsonNodeFactory 动态构建节点。这就像一个魅力!
推荐阅读
- mysql - 向查询输出添加附加列
- pdf - 如何将 Rhandsontable 输出下载到 .xlsx 和 .pdf?
- javascript - FabricJS 选择处理多个对象
- python - 从 python sdk 获取 Azure VM 的备份详细信息
- excel - 如何在Excel中已填充的列中向下拖动数据?
- java - 如何在没有真实文件的情况下压缩文件下载
- c# - 在组合框c#中写入后触发的事件
- akka - 如何调试卡住的 Akka 流?
- html - 对象内对象数组的长度运算符
- python - 用 scipy.integrate.solve_bvp 求解 ODE,我的函数的返回无法广播到 solve_bvp 的适当数组形状