2014-06-26 34 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) { 

} 
相关问题