Update sau SaveorUpdate în CRUDRespository, există vreo opțiune disponibilă? (Programare, Spring, Primăvară Boot)

Kul Bhushan Prasad a intrebat.

Încerc să fac operații CRUD cu entitatea mea de fasole. CRUDRepository Furnizez metode standard pentru find, , delete și save dar nu există nicio metodă generică disponibilă, cum ar fi saveOrUpdate(Entity entity) care, la rândul ei, apelează Hibernate sau HibernateTemplate sesiuni saveorUpdate() metode.

Modul în care CRUDRepository oferă această funcționalitate este de a folosi astfel

@Modifying
@Query("UPDATE Space c SET c.owner = :name WHERE c.id = :id")
Integer setNameForId(@Param("name") String name, @Param("id")

dar aceasta nu este generică și trebuie scrisă pentru toate câmpurile formularului.Vă rog să-mi spuneți dacă există vreo modalitate sau dacă pot obține sesiunea Hibernate sau obiectul Spring HibernateTemplate pentru a rezolva această problemă.

2 răspunsuri
geoand

Implementarea metodei

<S extends T> S save(S entity)

din interfață

CrudRepository<T, ID extends Serializable> extends Repository<T, ID>

face automat ceea ce doriți. În cazul în care entitatea este nouă, aceasta va apela persist la entity manager, , în caz contrar va apela merge

Codul arată în felul următor:

public <S extends T> S save(S entity) {

    if (entityInformation.isNew(entity)) {
        em.persist(entity);
        return entity;
    } else {
        return em.merge(entity);
    }
}

și poate fi găsit aici. Rețineți că SimpleJpaRepository este clasa care implementează automat CrudRepository în Spring Data JPA.

Prin urmare, nu este necesar să se furnizeze o clasă personalizată saveOrUpdate() personalizată. Spring Data JPA vă acoperă.

Comentarii

  • Bună ziua, aveți dreptate. Acum am o problemă, folosesc șablonul thymeleaf UI și fasolea pe care încerc să o mențin este o fasole Form, nu Entity bean și de aceea Spring boot nu o salvează. Acum trebuie să convertesc întregul Form bean în Entity bean cu valorile modificate și să încerc să îl persist. –  > Por Kul Bhushan Prasad.
  • De ce aș pune exact acest lucru dacă extind deja CrudRepository? Ar fi aceasta o metodă @Override în cadrul interfeței DAO? –  > Por rj2700.
  • @user1342086 Acesta este scopul, nu adăugați acest lucru, deoarece funcționalitatea este deja acolo –  > Por geoand.
  • @geoand Bine, mulțumesc. Înțeleg pentru saveOrUpdate(), dar cum rămâne cu update()? Am încercat să mă uit în CrudRepository.class dar nu am găsit niciuna. Deci, în cazul în care am un obiect Java și vreau să caut în baza de date pentru a vedea dacă acel obiect există (nu după ID, ci după celelalte coloane), cum se poate face acest lucru? –  > Por rj2700.
  • @Adaugați o metodă la interfața dvs., de exemplu findByName, iar Sprig Data o va crea automat. Documentația de referință are o mulțime de exemple –  > Por geoși.
Kul Bhushan Prasad

Problema este „Folosesc șablonul thymeleaf UI și fasolea pe care încerc să o persist, care este o fasole Form, nu Entity bean și de aceea Spring boot nu o salvează. Acum trebuie să convertesc întregul Form bean în Entity bean cu valori modificate și să încerc să îl persist.” Am obținut soluția pentru problema specifică cu care m-am confruntat în proiectul meu, Soluția este utilizarea @ModelAttribute pentru a converti bean-ul formular în entitate.

@ModelAttribute("spaceSummary")
public SpaceSummary getSpaceSummary(int id){
    return this.spaceSummaryService.getSpaceSummary(id);
}

și

@RequestMapping(value="/mgr/editSpace", method = RequestMethod.POST)
public ModelAndView editSpace(@ModelAttribute("spaceSummary") SpaceSummary                
spaceSummary, BindingResult result, RedirectAttributes redirect, ModelAndView model) {

}