2016-08-03 16 views
0

o/Wie kann ich einen Wert erhalten, der durch den Trigger (vor dem Einfügen) erzeugt wird, wenn ich ein Objekt speichere?

ich mit Spring-Boot auf Gradle w/JPA

Ich habe das Folgeobjekt: {"id":123,"year":"123","name":"Xxxx","userKey": XXXXX}

Ich werde POST nur "Namen" und "Jahr" und den MySQL-Trigger Erzeugen Sie den "userKey", BEVOR Sie die Daten einfügen.

Wenn ich rep.saveAndFlush(object) aufrufen, werde ich das neue Objekt an den Benutzer mit dem userKey zurückgeben.

Aber es ist nicht passiert! :/ Wenn ich die POST { "name" : "Teste" , "year" : 30} das System senden {"id":37,"year":"30","name":"Teste","userKey":null}

zurück, wenn ich versuche, die ID als Parameter zu erhalten vorbei, es {"id":37,"year":"30","name":"Teste","userKey":"VVUR"}

Warum gibt ??

Wie kann ich das Objekt mit Ihren vollständigen Daten zurückgeben?

Ich habe versucht:

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); 

Also .. ist nicht funktioniert noch! :(Gibt nur die ID und Null auf userKey zurück!

+0

Verwenden Sie em.refresh? –

+0

Wenn Sie keine Aktualisierung erzwingen wollen, um das einzufügende einzufügen, benötigen Sie einen Mechanismus, damit die Datenbanken Ihrem Provider/Ihrer Entität mitteilen können, was generiert wurde. Dies liegt außerhalb des Geltungsbereichs von JPA und wird daher provider-/datenbankspezifisch sein. Einige haben jedoch Funktionen, die Sie möglicherweise ändern können, wie z. B. die EclipseLink-Richtlinie für die Rückgabe. Http://www.eclipse.org/ecclipselink/documentation/2.5/jpa/ extensions/a_returninsert.htm # CIHHEGJE – Chris

+0

@NeilStockton Ich habe keine .refresh() Methode auf TesteRepository, wo ich es finden kann? –

Antwort

1

Mit triggle werden die Daten des verwalteten Objekts nicht mit realen Daten in der Datenbank synchronisiert (wie bei Massenaktualisierung oder Massenlöschung). Sie können das Objekt entweder aktualisieren oder löschen Sie den Cache der ersten Ebene des Rahmen

für den Frühling, ich bin nicht sicher über die Lösung, sondern kann Sie @CacheEvict und @Cacheable zur Umgehung des Problems verwenden können zum Beispiel:..

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

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

und der Prozess wird:

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

Hoffe, dass dies helfen wird!