如果 Employee 中有另一个对象,我如何正确地将 Employee 保存在 JSP 中

How can I properly save Employee in JSP if Employee have another object in it

员工实体:

@Entity
@Table(name = "EMPLOYEE")
public class Employee {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@ManyToOne(targetEntity = Department.class)
@JoinColumn(name = "department_id")
private Department department;
@Column(name = "FIRST_NAME")
private String firstName;
@Column(name = "LAST_NAME")
private String lastName;
@Column(name = "SALARY")
private int salary;

EmployeeDao 有两个变量路径来保存 Employee:

@Override
@Transactional(readOnly = false)
public void addEmployee(int departmentId, String firstName, String lastName, int salary) {
    Department department = getDepartmentById(departmentId);
    Employee employee = new Employee(department, firstName, lastName, salary);
    sessionFactory.getCurrentSession().save(employee);
}

@Override
@Transactional(readOnly = false)
public void addEmployee(Employee employee) {
    sessionFactory.getCurrentSession().save(employee);
}

...

主控制器:

@RequestMapping(value = "/employee/add", method = RequestMethod.GET)
public ModelAndView addPage(Model model) {
    model.addAttribute("emp", new Employee());
    List<Department> departments = dao.getAllDepartments();
    model.addAttribute("deps", departments);
    return new ModelAndView("Add");
}

@RequestMapping(value = "/employee/add", method = RequestMethod.POST)
public ModelAndView addEmployee(@ModelAttribute("emp") Employee employee) {

    System.out.println(employee);
    //dao.addEmployee(employee);
    return new ModelAndView("redirect:/");
}

和addPage.jsp

<c:url var="saveUrl" value="/employee/add" />

<form:form modelAttribute="emp" method="POST" action="${saveUrl}" >
    <p>Department : <select><c:forEach var="dep" items="${deps}">

            <option name="department" value="${dep.id}"> ${dep.name}</option>

    </c:forEach></select>
    </p>
    <p>
        First Name : <input size="40px" type="text" name="firstName" />
    </p>
    <p>
        Last Name : <input size="40px" type="text" name="lastName" />
    </p>
    <p>
        Salary : <input type="text" name="salary" />
    </p>
    <input height="300px" type="submit" value="Add User" />
</form:form>

如何从 JSP 将部门设置为我的员工?

另外:我有一个 REST-POST 方法可以正常工作,但我不知道如何在 JSP.

中使用它
@RequestMapping(value = "/add/employee/{departmentId}/{firstName}/{lastName}/{salary}", method = RequestMethod.POST, headers = "Accept=application/json")
public void addEmployee(@PathVariable int departmentId,@PathVariable String firstName,@PathVariable String lastName,@PathVariable int salary) {
    dao.addEmployee(departmentId, firstName, lastName, salary);
    dao.calculateAvgSalaryInDepartment();
}

求助,求助

您可以直接传递 object 和相应的键并保存实体,而不是传递 child id。

即用这个

替换你的 select 标签
<select>
    <c:forEach var="dep" items="${deps}">
       <option name="department" value="${dep}"> ${dep.name}</option>
    </c:forEach>
</select>

如果您只想传递 child 的主键,那么使用 @InitBinder 和 spring 验证器来识别 child。

参考this example

注意: 在其余方法中,您通过按 departmentId 获取部门来添加员工,因此它工作正常并且在您的 jsp post 请求您仅使用部门 ID 而不是部门 object.

传递员工实体