我试图通过提取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);
}
答案 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);
}