Обновление пользователя для гибернации удаляет роль пользователя

#java #spring #hibernate #spring-mvc

#java #spring #переход в спящий режим #spring-mvc

Вопрос:

Цель моего проекта — иметь администраторов / менеджеров / сотрудников / клиентов. После входа в систему пользователь в зависимости от роли будет иметь эти функции:

  1. Обновите информацию о сотрудниках в списке сотрудников (менеджеры, администраторы)
  2. Просмотр списка клиентов (Менеджеры, Администраторы, Сотрудники)
  3. Обновите собственную информацию пользователей (менеджер, администратор, сотрудник, клиенты)

Проблема, на которой я застрял в течение нескольких недель, заключается в том, что при обновлении любой информации о пользователях эта роль пользователя автоматически удаляется из базы данных. Это удаляет их доступ из веб-приложения.

Я провел некоторое исследование, пытаясь разобраться в этом, но не нашел надежного ответа. Любая помощь была бы оценена, спасибо!

Employee.java

 @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "employee_roles",
        joinColumns = @JoinColumn(name = "employee_id"),
        inverseJoinColumns = @JoinColumn(name = "role_id"))
private Collection<Role> roles;
  

EmployeeController.java —

 @PostMapping("/saveEmployee")
public String saveEmployee(@ModelAttribute("employee") Employee theEmployee) {

    employeeService.saveEmployee(theEmployee);

    return "redirect:/employee/list";
}
  

EmployeeDaoImpl.java —

 @Override
public void saveEmployee(Employee theEmployee) {
    // get current hibernate session
    Session currentSession = sessionFactory.getCurrentSession();


    // save Employee
    currentSession.update(theEmployee);
}
  

Журналы —

 Hibernate: update employee set address=?, email=?, first_name=?, last_name=?, password=?, phone_number=?, username=?, zipcode=? where id=?
Hibernate: delete from employee_roles where employee_id=?
  

Редактировать:

Role.java

 Entity
@Table(name = "role")
public class Role {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;

@Column(name = "name")
private String name;


public Role() {
}

public Role(String name) {
    this.name = name;
}

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

@Override
public String toString() {
    return "Role{"   "id="   id   ", name='"   name   '''   '}';
}
}
  

Комментарии:

1. вероятно, поле roles в Employee имеет значение null при обновлении. Попробуйте использовать точку останова в своем коде и просмотрите это поле перед обновлением employee.

2. Казалось бы, это так, я добавил системный вывод System.out.println(«Это роли сотрудников» theEmployee.getRoles()); и он вернул «Это роли сотрудников null»

3. Можете ли вы предоставить json, который вы отправляете?

4. Я не использую JSON / Restful для этого проекта atm

5. После добавления в файл jsp: <форма:скрытый путь=»роли»/>. Системный журнал возвращает [Роль{id=null, name=’Роль{id=3′}, Роль{id=null, name=’имя=’ROLE_ADMIN’}’}]

Ответ №1:

Вы можете добавить этот код в свой класс ролей:

 @ManyToMany(mappedBy="roles")
private Collection<Employee> employees;
  

Комментарии:

1. Спасибо за ответ, я обновил сообщение классом Role

2. Спасибо Джозепу за предоставление информации. Сначала я попытаюсь повысить свою репутацию.

3. Я добавил код, но результат не изменился. Проблема, похоже, в том, что сеанс не сохраняет роль пользователя, в результате чего он возвращает null. Поскольку hibernate видит null, он решает удалить отношение в базе данных.