JPA Transactional方法已保存该列后更新该列

问题描述

我保存了一个在REST Webservice中发布的对象,但是我试图在此之前更新一些字段。我有一个以B为属性的A类(没有关系,只有一个字段-由于此字段是一个单独的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的链接的启发,Ive将Map更改为JsonNode,并正在使用JsonNodeFactory动态构建节点。就像魅力一样!

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...