CRUDRespository 中的 Update 或 SaveorUpdate,是不是有可用的选项

Posted

技术标签:

【中文标题】CRUDRespository 中的 Update 或 SaveorUpdate,是不是有可用的选项【英文标题】: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 的对象来解决这个问题。

【问题讨论】:

【参考方案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) 


【讨论】:

以上是关于CRUDRespository 中的 Update 或 SaveorUpdate,是不是有可用的选项的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 中的 INSERT 和 UPDATE 有啥区别?

python 列表中的Update()函数

SQL语句update中的where条件的用法问题

如何覆盖自定义管理器类中的 .update() 方法

如何向SQLSERVER中表中的一列update成随机数?

UPDATE 查询的 WHERE 子句中的 SELECT 查询 [重复]