Как обрабатывать внешний ключ 1: N для CRUD в Spring MVC/Hibernate?

Я пытаюсь создать форму «обновления» для веб-приложения 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);
}

Где и как правильно обрабатывать параметры сообщения?

Вы видели, какие данные он отправил в контроллер? т. е. каково значение deptId в вашем почтовом контроллере?

suketup 21.05.2019 21:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
1 107
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я думаю, вы можете ошибиться в понимании присоединяемого объекта, потому что 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, поскольку я не смог найти ничего, что соответствовало бы моим потребностям.

Кто-нибудь, пожалуйста, исправьте мое решение, если оно неверно, но до сих пор я пробовал его с формами для действий создания и обновления, и он отлично работает.

Другие вопросы по теме