2016-02-12 19 views
9

Benim kontrolördeğiştiğini nasıl tek özellikleri güncellemek için - 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 
} 

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

Bu yöntem çalışır ama benim için oldukça çirkin. Kullanıcının görünüşte yeni isim alanını değiştirdiğini, kodumun yalnızca ilk ismi ayarlamak için işlevi çağırmak için nasıl uyarlayabileceğimi söyleyelim.

Değişen alana bildirim yapmak için Observer modeli gibi bir şey var mı? Eğer hazırda bekletme kullanıyorsanız

+0

Hazırda bekletme özelliğini mi kullanıyorsunuz? – Musaddique

+0

evet, daha doğrusu – melkir

+0

olmak için hazırda bekletme, önyükleme-starter-data-jpa kullanıyorum, aşağıdaki yanıtımı kullanıyorum dynamicUpdate = true. sadece değiştirilen değerleri günceller. – Musaddique

cevap

3

Kodunuzun şu şekilde çalıştığını varsayalım:

Bir kullanıcı, user entity'un bazı verilerini değiştirmek istiyor. Önceden ifade ettiğin gibi, ona bütün girişlerini DB'nin kullanıcı adı, soyadı, vb. Örneğin, kullanıcı ilk adını değiştirdi ve kaydet düğmesine basıldı. Denetleyiciniz, user.id, yeni ad ve tüm eski ayar değerleri dahil olmak üzere kullanıcı varlığını alır. Kodunuz bu şekilde çalışıyorsa, kullanıcı varlığı kolayca save() yapabilirsiniz. Kullanıcıyı önce DB'den getirmeye gerek yoktur.

Dolayısıyla, sadece böyle yapmak:

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

Repository kullanıcı varlığın kimliği bilir ve sadece tam varlık güncelleştirmek.

Ve kullanıcı varlıktaki kimliği yok nedenle

bu gibi denetleyicisinden kimliği kullanın:

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

Açıklamalarınız için teşekkür ederiz! – melkir

+0

Bu soruya cevap vermiyor. Soru şu: "Yalnızca değiştirilen öznitelikleri nasıl güncellerim". Cevap, hala userRepository.save (...) içindeki öznitelikleri günceller. sadece ayarlar yapmaz ama kaputun arkasında veri tabanına ayarlanır. Örnek: user.firstName = 'lolo', kullanıcı user.lastName = 'koko' değiştirmek istiyor. ama @Trudy bunu kesiyor ve ilk ismi de değiştiriyor. Güncelleme hem – lolo

+0

@lolo olarak değişecektir. Belki de% 100'lük bir soruya cevap vermiyor ama tam olarak aradığı çözümdü. Çünkü "updateUser" için "çirkin" bir yöntem istemedi. Downvote haklı olup olmadığını bilmiyorum. – Patrick

1

sonra sadece hibenrate 4 için kod

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

altında gibi db

alanları güncellenmiş olarak güncellenir hazırda dynamicUpdate = true bir özelliği yoksa + bu

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

Ek açıklamalara ihtiyacım var mı? Bunu soruyorum çünkü updateUser yöntemim hala tüm alanları ayarlıyor. Ancak bunun, ".save()" yöntemi için veritabanı sorgularını azaltacağını kabul ediyorum. – melkir

+0

Hayır. Yalnızca güncellenmiş verileri ayarlamanın bir yolu yoktur. Çünkü kullanıcı tüm verilere sahip olmalıdır. çünkü nihayet o zaman veritabanında güncellemek için gidiyor, böylece tüm verileri gerekir hibernate null kullanıcı güncelleme özelliği yok .. – Musaddique

-1

bu kullanıcı varsayalım.

@Entity 
public class User{ 
    String userName; 
} 

Ardından jsp sayfanızda aşağıdakine benzer bir işlem yapabilirsiniz.

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

Ve tekrar dao içinde, sen

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

Lütfen dikkat boş çeke koyabilirsiniz, bu kod test edilip downvotes bekliyor edilmez.

İlgili konular