gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:39:11 25 4
gpt4 key购买 nike

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

但我注意到我尝试了另一个类,它有两个字段 id(int)(primarykey) 和 college(Varchar)。当 id 添加 <form:hidden path="id" /> 时,这里的更新是正确的另外以 jsp 形式。

saveOrUpdate() does the following:

  • if the object is already persistent in this session, do nothing
  • if another object associated with the session has the same identifier, throw an exception
  • if the object has no identifier property, save() it
  • if the object's identifier has the value assigned to a newly instantiated object, save() it
  • if the object is versioned by a or , and the version property value is the same value assigned to a newly
    instantiated object, save() it
  • otherwise update() the object

模型类

@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);
}

Controller 类

//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>

最佳答案

问题是您的模型只有一个字段并且是主键。当您尝试更新您的实体时,您会更改表单中键的值,因此 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。如果您使用字符串外键,将很难更新其他表,尤其是当它们有很多记录时。

关于java - Hibernate saveOrUpdate() 在更新时创建新条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44754948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com