【问题标题】:Update or SaveorUpdate in CRUDRespository, Is there any options availableCRUDRespository 中的 Update 或 SaveorUpdate,是否有可用的选项
【发布时间】:2014-08-16 17:15:25
【问题描述】:

我正在尝试使用 My Entity bean 进行 CRUD 操作。 CRUDRepositoryfinddeletesave 提供标准方法,但没有像 saveOrUpdate(Entity entity) 这样的通用方法,它依次调用 HibernateHibernateTemplate 会话 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 的对象来解决这个问题。

【问题讨论】:

    标签: spring spring-boot


    【解决方案1】:

    方法的实现

    <S extends T> S save(S entity)

    从界面

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

    自动做你想做的事。如果实体是新的,它将在entity manager 上调用persist,否则它将调用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 为您服务。

    【讨论】:

    • 嗨,你是对的。我现在遇到了问题,我正在使用 thymeleaf UI 模板和我试图坚持的 Bean,它是 Form bean 而不是 Entity bean,这就是 Spring boot 不保存它的原因。现在我必须将整个 Form bean 转换为具有更改值的 Entity bean 并尝试将其持久化。
    • 如果我已经在扩展 CrudRepository,为什么还要放这个?这会是接口 DAO 中的 @Override 方法吗?
    • @user1342086 这就是重点,你不要添加这个,因为功能已经存在
    • @geoand 好的,谢谢。我得到了 saveOrUpdate() 但 update() 呢?我尝试查看 CrudRepository.class 但找不到。因此,如果我有一个 Java 对象并且我想搜索数据库以查看该对象是否存在(不是通过 ID 而是通过其他列),那么将如何去做呢?
    • @你会在你的界面中添加一个方法,例如 findByName,Sprig Data 会自动创建它。参考文档有很多例子
    【解决方案2】:

    问题是“我正在使用 thymeleaf UI 模板和我试图坚持的 Bean,它是 Form bean 而不是 Entity bean,这就是 Spring boot 不保存它的原因。现在我必须将整个 Form bean 转换为 Entity更改值的 bean 并尝试将其持久化。”我得到了我在项目中遇到的具体问题的解决方案,解决方案是使用 @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) {
    
    }
    

    【讨论】:

      猜你喜欢
      • 2017-09-28
      • 2015-12-11
      • 2011-11-20
      • 1970-01-01
      • 2021-02-07
      • 2016-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多