我创建了一个名为“ 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>
答案 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