我正在尝试为CRUD Web应用程序创建一个“更新”表单。与我的问题相关的类在MySQL数据库中以 1:N 的方式关联。
我很难找到将部门参数转换为正确类型的优雅解决方案。我可以使用表单的jsp构建一个丑陋的解决方法,但我想知道什么是 standard SpringMVC / Hibernate解决方案。
我有以下Hibernate实体类, Employee 和部门,它们通过以下代码实现:
@Entity
@Table(name="employee")
public class Employee {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id;
@JoinColumn(name = "ID_DEPT", referencedColumnName = "ID_DEPT")
@ManyToOne(optional = false)
private Department deptId;
...
}
update 是通过jsp文件中的发布请求执行的,如下所示:
<form:hidden path="idEmployee" />
<div class="form-group">
<label for="deptid" class="col-md-3 control-label">Department</label>
<div class="col-md-9">
<form:input path="deptId" cssClass="form-control" />
</div>
</div>
....
发布请求将不会为 deptId 提供正确的类型,从而引发类型不匹配错误。
saveEmployee动作的控制器代码为:
@PostMapping("/saveEmployee")
public String saveDisciplina(@ModelAttribute("employee") Disciplina theDisciplina) {
return "redirect:/employee/list";
}
与EmployeeDAO相关的代码为:
@Override
public void saveEmployee(Employee theEmployee) {
Session currentSession = sessionFactory.getCurrentSession();
currentSession.saveOrUpdate(theEmployee);
}
在哪里以及如何正确处理post参数?
答案 0 :(得分:1)
我认为您可能会误解对联接实体的理解,因为java存储了该实体的引用。并且您必须在更新时与参考一起在休眠状态下找到它。
看看这个例子,希望对您有帮助:
https://www.callicoder.com/hibernate-spring-boot-jpa-one-to-many-mapping-example/
答案 1 :(得分:0)
实际上需要更改的只是jsp更新表单中的以下行:
<form:input path="deptId" cssClass="form-control" />
在这种情况下,正确的路径应该是path=deptId.deptId
。这将调用 Department 类的适当的构造函数,该类又实例化一个 Department 对象,并将其另存为包含该对象的 Employee 对象的一部分。
太糟糕了,如此强大的功能具有如此糟糕的文档。春季菜鸟容易感到不知所措。我加入此段的唯一原因是,也许有人会评论指向正确的Spring文档的链接,因为我找不到适合我需要的内容。
如果有误,请纠正我的解决方案,但是到目前为止,我已经尝试过使用表单来创建和更新操作,并且效果很好。