2014-06-26 12 views
23

Sto tentando di eseguire operazioni CRUD con il bean My Entity. CRUDRepository fornisce metodi standard a find, delete e save ma non esiste un metodo generico disponibile come saveOrUpdate(Entity entity) che a sua volta chiama i metodi Hibernate o HibernateTemplate sessioni saveorUpdate().Aggiornamento o salvataggio o aggiornamento in CRUDRespository, Sono disponibili tutte le opzioni

Il modo CRUDRepository fornisce questa funzionalità è quello di uso come questo

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

, ma questo non è generico e deve essere scritto per i campi del modulo completo. Per favore fatemi sapere se c'è qualche modo o posso ottenere la sessione di Hibernate o l'oggetto di Spring HibernateTemplate per risolvere questo problema.

risposta

64

L'implementazione del metodo

<S extends T> S save(S entity)

dall'interfaccia

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

fa automaticamente quello che vuoi. Se l'entità è nuovo si chiama persist sul entity manager, altrimenti si chiamerà merge

Il codice è simile al seguente:

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

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

e può essere trovato here. Si noti che SimpleJpaRepository è la classe che implementa automaticamente CrudRepository in Spring Data JPA.

Pertanto, non è necessario fornire un metodo personalizzato saveOrUpdate(). Spring Data JPA ha coperto.

+1

Salve, lei ha ragione. Ho il problema ora, sto usando template UI di thymeleaf e The Bean che sto cercando di mantenere questo è bean Form non bean Entity ed è per questo che Spring boot non lo sta salvando. Ora devo convertire l'intero bean Form in bean Entity con valori modificati e provare a persisterlo. –

+0

@KulBhushanPrasad Sembra buono! – geoand

+0

Perché dovrei inserirlo esattamente se sto già estendendo il CrudRepository? Questo è un metodo @Override nell'interfaccia DAO? – rj2700

0

Ho ottenuto la soluzione, La soluzione è utilizzare @ModelAttribute per convertire il bean di form in entità.

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

e

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

} 
Problemi correlati