如何在jpa hibernate中通过id更新行?

时间:2018-02-12 04:35:11

标签: spring hibernate spring-data-jpa jpql

我试图通过提取idByName来更新数据库中的行,但是它却添加了一个新行?请帮帮我。

这是我的控制器代码:

@PostMapping("/retailer/update")
public ModelAndView updateRetailer(@ModelAttribute("retailer") Retailer retailerDetails)
{   
    System.out.println(retailerDetails.toString());
    System.out.println("method called");
    UUID id=repository.findIdByName(retailerDetails.getBusinessName());
    System.out.println(retailerDetails.getBusinessName());
    System.out.println(id);
    String name=retailerDetails.getBusinessName();
    System.out.println(name);
    //Retailer retailer=repository.findOne(rid);
    if(id == null)
    {
        return null;
    }
    retailerDetails.setBusinessName(retailerDetails.getBusinessName());
    retailerDetails.setCity(retailerDetails.getCity());
    retailerDetails.setIsActive(retailerDetails.getIsActive());
    retailerDetails.setStartDate(retailerDetails.getStartDate());
    retailerDetails.setUrl(retailerDetails.getUrl());

    repository.save(retailerDetails);
    return new ModelAndView("welcome");
   }

这是我的存储库代码:

public interface RetailerRepository extends JpaRepository<Retailer, UUID>{

    @Query("SELECT r.id FROM Retailer r where r.businessName=:name")
    UUID findIdByName(@Param("name") String name);
}

3 个答案:

答案 0 :(得分:1)

您应该忘记将“id”设置为retailerDetails实体。 Spring JPA仅在设置主键时执行更新操作。

在代码中添加了以下行。

retailer.setId(id);
repository.save(retailer);

答案 1 :(得分:0)

您应该只按BusinessName获取。

存储库方法是:

Retailer findByBusinessName(@Param("name") String name);

updateRetailer方法如下:

Retailer retailer = findByBusinessName(retailerDetails.getBusinessName());
if(retailer!=null){
    retailer.setBusinessName(retailerDetails.getBusinessName());
    retailer.setCity(retailerDetails.getCity());
    retailer.setIsActive(retailerDetails.getIsActive());
    retailer.setStartDate(retailerDetails.getStartDate());
    retailer.setUrl(retailerDetails.getUrl());
    repository.save(retailer);
}

答案 2 :(得分:0)

您的控制器看起来很棒,您的存储库也是如此。在使用hibernate更新实体时,您应该知道一些事情。如果在事务期间给定项的id为null,则Hibernate将保存(创建新对象),如果id存在,则hibernate将保存(更新数据库中的当前实例)。

我认为此更新的流程是在请求更新请求时,您根据指定的实体检索对象,然后返回到视图。 需要注意的一件事就是在视图中随身携带你的身份证。 确保将id包含在隐藏的输入中,如

从那里除了更新的数据之外还将提交id到post方法。 与此类似的大多数更新问题都可以通过版本化实体与@Version

来解决

使用Spring Data JPA的格式成功查询,无需编写任何查询。

@Repository 公共接口RetailerRepository扩展了JpaRepository {

// Assuming there is an attribute businessName in the Retailer entity.
UUID findByBusinessName(String businessName);

}