如何在Spring MVC / Hibernate中处理CRUD的1:N外键?

时间:2019-05-21 19:11:29

标签: java spring hibernate spring-mvc web

我正在尝试为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参数?

2 个答案:

答案 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文档的链接,因为我找不到适合我需要的内容。

如果有误,请纠正我的解决方案,但是到目前为止,我已经尝试过使用表单来创建和更新操作,并且效果很好。