Обновить или SaveorUpdate в CRUDRespository, есть ли доступные варианты

Я пытаюсь выполнять операции CRUD с My Entity bean. CRUDRepository предоставляют стандартные методы find, delete и save, но не существует общего метода, такого как saveOrUpdate(Entity entity), который в свою очередь вызывает методы Hibernate или HibernateTemplate sessions saveorUpdate().

Способ 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 для решения этой проблемы.

Ответ 1

Реализация метода

<S extends T> S save(S entity)

из интерфейса

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

автоматически делает то, что вы хотите. Если объект новый, он вызовет persist в entity manager, иначе он вызовет merge

Код выглядит следующим образом:

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

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

и можно найти здесь. Обратите внимание, что SimpleJpaRepository - это класс, который автоматически реализует CrudRepository в Spring Data JPA.

Поэтому нет необходимости поставлять собственный метод saveOrUpdate(). Spring Данные JPA вы рассмотрели.

Ответ 2

Я получил решение. Решение использует @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) {

}