2016-02-12 11 views
9

mio regolatoreCome aggiornare solo gli attributi che sono stati modificati - Spring MVC

@RequestMapping(value = "/user/{id}", method = RequestMethod.GET) 
public String updateUserById(@PathVariable("id") Long id, Model model) { 
    User user = userRepository.findOne(id); 
    model.addAttribute(user); 
    return "admin/editUser"; 
} 

@RequestMapping(value = "/user/{id}", method = RequestMethod.POST) 
@ResponseBody 
public String updateUserById(@PathVariable("id") Long id, @ModelAttribute User user) { 
    userRepository.updateUser(id, user); // with a try catch 
} 

Il dao

@Override 
public void updateUser(Long id, User user) { 
    User userDB = userRepository.findOne(id); 
    userDB.setFirstName(user.getFirstName()); 
    userDB.setLastName(user.getLastName()); 
    userDB.setEmail(user.getEmail()); 
    userDB.setUsername(user.getUsername()); 
    userRepository.save(userDB); 
} 

questo metodo funziona, ma è abbastanza brutto per me. Supponiamo che l'utente abbia appena modificato il campo nome nella vista, come posso adattare il mio codice per chiamare solo la funzione per impostare il nome?

Qualcosa come il pattern Observer per notificare i campi che sono cambiati?

+0

r usando ibernazione? – Musaddique

+0

sì sto usando l'ibernazione, spring-boot-starter-data-jpa per essere più precisi – melkir

+0

vedi la mia risposta qui sotto uso dynamicUpdate = true. aggiornerà solo i valori modificati. – Musaddique

risposta

3

Suppongo che il tuo codice funzioni in questo modo:

Un utente desidera modificare alcuni dati del suo user entity. In frontend gli hai già mostrato tutte le sue voci dalla tabella utente del DB come nome, cognome e così via.

Ad esempio, l'utente ha cambiato il suo nome e ha premuto il pulsante Salva. Il controller riceve l'entità utente inclusiva user.id, il nuovo nome e tutti i vecchi valori impostati. Se il tuo codice funziona così puoi facilmente save() l'entità utente. Non è necessario prima recuperare l'utente dal DB.

Quindi, solo fare in questo modo:

@Override 
public void updateUser(User user) { 
    userRepository.save(user); 
} 

Il Repository conosce l'ID dell'entità utente e solo aggiornare l'entità completa.

E per il motivo che non hanno il Id nella vostra entità utente utilizzare l'ID dal vostro controller come questo:

@Override 
public void updateUser(User user, Long Id) { 
    user.setId(Id); 
    userRepository.save(user); 
} 
+0

Grazie per le tue spiegazioni! – melkir

+0

Non risponde alla domanda. La domanda è: "Come aggiornare solo gli attributi che sono cambiati". La risposta, continua ad aggiornare gli attributi dentro userRepository.save (...). semplicemente non fa serie ma dietro al cofano accadrà il set per il database. Esempio: user.firstName = 'lolo', l'utente vuole cambiare user.lastName = 'koko'. ma @trudy lo intercetta e cambia anche il nome. L'aggiornamento cambierà sia in – lolo

+0

@lolo Forse non risponde alla domanda del 100% ma è stata esattamente la soluzione che ha cercato. Perché non desidera un metodo "brutto" di 'updateUser'. Quindi non so se il downvote è giustificato. – Patrick

1

se si utilizza ibernazione poi c'è un attributo in ibernazione dynamicUpdate = true che aggiornerà i campi in db

solo aggiornato come sottostante Codice

@Entity 
@Table(name = "User") 
@org.hibernate.annotations.Entity(
     dynamicUpdate = true 
) 
public class User 

per hibenrate 4 + utilizzare questi

@DynamicInsert(true) 
@DynamicUpdate(true) 
+0

Le annotazioni sono tutto ciò di cui ho bisogno? Lo sto chiedendo perché il mio metodo updateUser sta ancora impostando tutti i campi. Ma sono d'accordo che ciò ridurrà le query del database per il metodo ".save()". – melkir

+0

No. non è possibile impostare solo i dati aggiornati. perché l'utente dovrebbe avere tutti i dati. perché finalmente si aggiornerà nel database in modo tale che ibernazione abbia bisogno di tutti i dati altrimenti ibernazione aggiornerà null se l'utente non ha valore attributo .. – Musaddique

-1

Supponiamo questo è il vostro utente.

@Entity 
public class User{ 
    String userName; 
} 

Quindi nella tua pagina jsp puoi fare qualcosa come sotto.

<input type = "text" name = "userName" value = "${userName}" data-changed = "false" class="form_elem"/> 

<script> 
    $(".form_elem").change(function(){ 
     $(this).data("changed", true); 
    }); 

    function submit(){ 
     $(".form_elem").each(function(){ 
      if($(this).data("changed") == false){ 
       $(this).val(""); 
      } 
     }); 
     //Do submit here 
    } 
</script> 

E ancora nel vostro dao, si può mettere sul controllo nullo

@Override 
public void updateUser(Long id, User user) { 
    User userDB = userRepository.findOne(id); 
    if(user.getFirstName() != null){ 
     userDB.setFirstName(user.getFirstName()); 
    } 
} 

Si prega di notare, questo codice non è testato e attende downvotes.

Problemi correlati