Hibernate saveOrUpdate()在更新时创建新条目

时间:2017-06-26 07:37:23

标签: java mysql spring hibernate jsp

我创建了一个名为“ gauge_category ”的表,它只有一个字段 gauge_category_id ”这是主键,数据类型是 VARCHAR 即可。我试过CRUD操作。创建,读取,删除操作完美。当我更新时,它正在创建一个新条目,而不是更新。我从一些文章中了解了saveOrUpdate()。单击编辑按钮时从URL传递的参数正常工作。

但是我注意到我尝试了另一个有两个字段id(int)(primarykey),college(Varchar)的类。当jsp格式中另外添加<form:hidden path="id" />时,更新正在正确地进行更新。

  

saveOrUpdate()执行以下操作:

     
      
  • 如果该对象在此会话中已经持久化,则不执行任何操作
  •   
  • 如果与会话关联的另一个对象具有相同的标识符,则抛出异常
  •   
  • 如果对象没有标识符属性,则保存()它
  •   
  • 如果对象的标识符具有分配给新实例化对象的值,则保存()它
  •   
  • 如果对象是由或者版本化的,并且版本属性值是分配给新的相同的值   实例化对象,save()它
  •   
  • 否则更新()对象
  •   

模型类

@Entity
@Table(name = "gauge_category")
public class GaugeCategory {

    @Id
    @Column(name = "gauge_category_id", unique = true, nullable = false)
    private String category;    

    public GaugeCategory() {
        super();
    }

    public GaugeCategory(String category) {
        super();
        this.category = category;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }   
}

Dao实施班

//other methods, @Autowired

        @Override
        public void saveOrUpdate(GaugeCategory GaugeCategory) {
            sessionFactory.getCurrentSession().saveOrUpdate(GaugeCategory);     
        }

控制器类

//other methods, @Autowired

@RequestMapping(value = "/save", method = RequestMethod.POST)
    public ModelAndView saveCategory(@ModelAttribute("gaugeCategoryForm") GaugeCategory gaugeCategory) {
        gaugeCategoryService.saveOrUpdate(gaugeCategory);
        return new ModelAndView("redirect:/gaugeCategory/list");
    }

jsp页面添加

<spring:url value="/gaugeCategory/save" var="saveURL"></spring:url>

<form:form action="${saveURL} " modelAttribute="gaugeCategoryForm"> 

     <form:input path="category" />

</form:form>

2 个答案:

答案 0 :(得分:0)

问题是您的模型只有一个字段及其主键。当您尝试更新实体时,您需要更改表单中的键值,因此hibernate不知道它应该更新哪个实体并改为创建新实体。

另外,只有一个字段的模型的目的是什么?最好有一些实体,比如:

@Entity
@Table(name = "gauge_category")
public class GaugeCategory {

    @Id
    @GeneratedValue
    private Integer id;

    @Id
    @Column(name = "name", unique = true, nullable = false)
    private String name;

    // ...

}

拥有这样的实体,您将能够使用id和引用其他数据库表中的id来更新类别的名称。如果使用字符串外键,则很难更新其他表,特别是如果它们有大量记录。

答案 1 :(得分:0)

如果要更新对象

,则需要传递主键ID