Я несколько дней пытался решить эту проблему, но не могу понять. У меня есть 3 таблицы: пользователи, сотрудники (расширяет пользователей) и роли. У меня проблема в том, что я не могу найти способ заставить спящий режим понять, что мне нужен однонаправленный ко многим между пользователями и ролями. Я не хочу получать всех пользователей из таблицы ролей. В приведенной ниже конфигурации, когда я пытаюсь вставить новое значение в таблицу «Пользователи», вместо использования существующих значений из ролей он вставляет новое, создавая повторяющиеся значения с разными идентификаторами. Есть ли у вас какие-либо предложения? Спасибо. Ниже приведены классы, которые я использую:
Пользователь:
@Entity
@Table(name = "users")
@Inheritance(strategy = InheritanceType.JOINED) // used for the Employees table
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String username;
private String password;
private String e_mail;
private String phoneNumber;
private String name;
private String surname;
private Date birthDate;
private String adress;
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
@JoinColumn(name = "role_id", referencedColumnName = "id", nullable = false)
private Role role;
public User() { }
public User(String username, String password, String e_mail, String phoneNumber, String name,
String surname, Date birthDate, String adress, Role role) {
this.username = username;
this.password = password;
this.e_mail = e_mail;
this.phoneNumber = phoneNumber;
this.name = name;
this.surname = surname;
this.birthDate = birthDate;
this.adress = adress;
this.role = role;
}
//getters and setters
}
Ролевая сущность:
@Entity
@Table(name = "roles")
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
public Role() { }
public Role(String name) {
this.name = name;
}
//getters and setters
}
UserDto:
public class UserDto {
@JsonIgnore
private Long id;
private String username;
private String password;
private String e_mail;
private String phoneNumber;
private String name;
private String surname;
private Date birthDate;
private String adress;
@JsonIgnore
private RoleDto role = new RoleDto();
public UserDto() { }
// getters and setters
}
RoleDto:
public class RoleDto {
@JsonIgnore
private Long id;
private String name;
public RoleDto() { }
// getters and setters
}
UserService:
@Service
public class UserService {
private UserRepository userRepository;
private ModelMapper modelMapper = new ModelMapper();
public UserService(RoleService roleService, UserRepository userRepository, RoleRepository roleRepository) {
this.roleService = roleService;
this.userRepository = userRepository;
this.roleRepository = roleRepository;
}
public void addUser(UserDto userDto) {
userDto.setRole(roleService.getBuyerRoleDto());
userRepository.save(modelMapper.map(userDto, User.class));
}
// other services...
}
RoleService:
@Service
public class RoleService {
private RoleRepository roleRepository;
private ModelMapper modelMapper = new ModelMapper();
public RoleService(RoleRepository roleRepository) {
this.roleRepository = roleRepository;
}
/*
* i've tested the queries getById and getBuyerId and they are working as they should
*/
public RoleDto getBuyerRoleDto() {
return modelMapper.map(roleRepository.getbyId(roleRepository.getBuyerId()), RoleDto.class);
}
// other services...
}
User
объект вы действительно сохраняете в БД? Вы устанавливаете @JsonIgnore вid
полях, поэтому они могут быть пропущены modelMapper - так что userDto имеет roleDto без идентификатора вaddUser
- вот почему вы пытаетесь сохранить сущность User без идентификатора, содержащую сущность Role без идентификатора, тем самым создавая новую роль . - person Alex Rudenko   schedule 02.05.2020