Я пытаюсь создать форму «обновления» для веб-приложения CRUD. Классы, связанные с моим вопросом, связаны способом 1:Н в базе данных MySQL.
У меня возникли проблемы с поиском элегантного решения для приведения параметра отделение к правильному типу. Я мог бы создать уродливый обходной путь с jsp формы, но я хотел бы знать, что такое решение стандартный SpringMVC/Hibernate.
У меня есть следующие классы сущностей Hibernate, Работник и отделение, реализованные с помощью следующего кода:
@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;
...
}
Обновить выполняется через почтовый запрос в файле 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>
....
Почтовый запрос не предоставит правильный тип для ID отдела, что приведет к ошибке несоответствия типа.
Код контроллера для действия 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);
}
Где и как правильно обрабатывать параметры сообщения?
Я думаю, вы можете ошибиться в понимании присоединяемого объекта, потому что java хранит ссылку на объект. и вы должны найти его в спящем режиме со ссылкой при обновлении.
Взгляните на этот пример, и я надеюсь, что он может вам помочь:
https://www.callicoder.com/hibernate-spring-boot-jpa-one-to-many-mapping-example/
Что на самом деле нужно изменить, так это только эту строку в форме обновления jsp:
<form:input path = "deptId" cssClass = "form-control" />
Правильный путь в этом случае будет path=deptId.deptId
. Это вызывает соответствующий конструктор для класса отделение, который, в свою очередь, создает экземпляр объекта отделение, который будет сохранен как часть объекта Работник, который его содержит.
Жаль, что такая замечательная функциональность имеет такую плохую документацию. Нуб Spring может легко почувствовать себя подавленным. Единственная причина, по которой я включаю этот абзац, заключается в том, что, возможно, кто-то прокомментирует ссылку, указывающую на надлежащую документацию Spring, поскольку я не смог найти ничего, что соответствовало бы моим потребностям.
Кто-нибудь, пожалуйста, исправьте мое решение, если оно неверно, но до сих пор я пробовал его с формами для действий создания и обновления, и он отлично работает.
Вы видели, какие данные он отправил в контроллер? т. е. каково значение deptId в вашем почтовом контроллере?