2014-06-26 43 views
23

我正在嘗試使用My Entity bean執行CRUD操作。 CRUDRepository提供了find,0 deletesave的標準方法,但沒有類似saveOrUpdate(Entity entity)的通用方法,該方法又調用HibernateHibernateTemplate會話saveorUpdate()方法。在CRUDRespository中更新或保存更新,是否有任何可用選項

的方式CRUDRepository提供此功能是 使用這樣

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

但這不是通用的,需要完整的表單字段寫入。 請讓我知道是否有任何方式,或者我可以獲得Hibernate會話或Spring HibernateTemplate對象來解決此問題。

回答

64

方法

<S extends T> S save(S entity)

從接口

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

實現自動你想要做什麼。如果實體是新的,它會調用在entity managerpersist,否則它會調用merge

的代碼看起來是這樣的:

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

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

,可以發現here。請注意,SimpleJpaRepository是在Spring Data JPA中自動實現CrudRepository的類。

因此,沒有必要提供自定義的saveOrUpdate()方法。 Spring Data JPA已經涵蓋了你。

+1

嗨,你是正確的。我現在得到了這個問題,我正在使用thymeleaf UI模板和我試圖堅持的Bean,它是Form bean not Entity bean,這就是爲什麼Spring引導程序沒有保存它。現在,我必須將整個Form bean轉換爲具有更改值的Entity bean,並嘗試將其保留。 –

+0

@KulBhushanPrasad聽起來不錯! – geoand

+0

如果我已經在擴展CrudRepository,爲什麼要把它放到這裏呢?這是否是接口DAO中的@Override方法? – rj2700

0

我得到了解決方案,解決方案是使用@ModelAttribute將表單bean轉換爲實體。

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

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

} 
相關問題