当我保存项目时,如何获得触发器(插入前)生成的值?

时间:2016-08-03 16:47:00

标签: spring jpa

O /

我在Gradle w / JPA上使用Spring Boot

我有以下对象:{"id":123,"year":"123","name":"Xxxx","userKey": XXXXX}

我将只发布“name”和“year”,MySQL Trigger将在插入数据之前生成“userKey”。

当我调用rep.saveAndFlush(object)时,我将使用userKey将新对象返回给用户。

但它没有发生! :/ 当我发送POST { "name" : "Teste" , "year" : 30}时 系统返回{"id":37,"year":"30","name":"Teste","userKey":null}

如果我尝试将ID作为参数传递,则返回{"id":37,"year":"30","name":"Teste","userKey":"VVUR"}

为什么?

如何使用完整数据返回对象?

我试过了:

testeRepository.saveAndFlush(teste);
return new ResponseEntity<> (teste, HttpStatus.CREATED);

&安培;

testeRepository.saveAndFlush(teste);
testeRepository.flush(teste);
return new ResponseEntity<> (teste, HttpStatus.CREATED);

&安培;

testeRepository.saveAndFlush(teste);
testeRepository.flush(teste);
teste = testeRepository.findOne(teste.getId()); /* Same as GET */
return new ResponseEntity<> (teste, HttpStatus.CREATED);

所以..还没有工作! :(只需返回userKey上的ID和Null!

1 个答案:

答案 0 :(得分:1)

使用triggle,托管对象的数据将不会与数据库中的实际数据同步(如批量更新或批量删除)。 您可以刷新对象或清除框架的第一级缓存。

对于Spring,我不确定解决方案,但可能您可以使用@CacheEvict和@Cacheable来解决问题。 例如:

  @CacheEvict(value = "teste", allEntries = true)
  public void resetAllEntries() {
    // Intentionally blank
  }

  @Cacheable(value="teste")
  public Teste update(Teste teste){
     return rep.saveAndFlush(teste);
   }

,过程将是:

 teste = update(teste);
 resetAllEntries();
 teste = findById(teste.getId());

希望这会有所帮助!