2016-03-26 7 views
2

Gibt es eine Möglichkeit, einen neuen Datensatz einzufügen, wenn nicht vorhanden ist, und den Datensatz zu aktualisieren, wenn vorhanden, ohne alte Daten zu verlieren?Spring JPA: Wie upsert man, ohne Daten zu verlieren

Dies ist meine Service-Layer-Methode:

public void saveSample(Sample sample) { 
    Sample samplePersistent = sample; 

    if (sample.getId() != null) { 
     samplePersistent = sampleRepository.findOne(sample.getId()); 
     Assert.notNull(samplePersistent, "Sample entity not found with id : " + sample.getId()); 

     samplePersistent.setLocation(sample.getLocation()); 
     samplePersistent.setName(sample.getName()); 
     samplePersistent.setType(sample.getType()); 
     ... 
     ... 

    } 

    samplePersistent.cloneAuditingInfoFrom(sample); 
    sampleRepository.save(sample); 
} 

Ich denke, diese nutzlosen Weg.

Kann Spring BeanUtils Class oder @DynamicUpdate Annotation mein Problem lösen?

Antwort

2

Da Sie bereits Spring und Spring-Data-Jpa verwenden, würde der Aufruf sampleRepository.save(sample); ausreichen. save Die Methode überprüft zuerst, ob die übergebene Entität eine neue Entität oder eine vorhandene basierend auf dem Identitätswert der Entität ist. Identität wird durch Primärschlüssel Ihrer Entität definiert.

Sie können auch EntityManager#merge Methode verwenden. Da Sie jedoch bereits Spring Data verwenden, ruft save method intern die Merge-Methode auf.

Meiner Meinung nach müssen Sie nicht @DynamicUpdate verwenden, es sei denn, Sie haben so viele Felder aktualisiert werden, aber nur wenige werden tatsächlich aktualisiert und hat auch viele Einschränkungen mit anderen Tabellen.

Spring BeanUtils hat nichts mit Objektpersistenz zu tun. Es zielt hauptsächlich auf Java-Bean-spezifische Operationen wie das Kopieren von Eigenschaften, das Finden von Methoden einer Bean, das Beschreiben von Eigenschaftsdeskriptoren usw. ab.

PS: Sie müssen also nicht überprüfen, ob sample.getId() Null ist oder nicht, und den Datensatz abrufen von DB mit findOne Methode. Wenn Sie einfach sampleRepository.save(sample) übergeben, wird der Datensatz gespeichert/aktualisiert.

Verwandte Themen