Я несколько дней пытался решить эту проблему, но я не могу понять это. У меня есть 3 таблицы: пользователи, сотрудники (что расширяет пользователей) и роли. У меня проблема в том, что я не могу найти способ заставить hibernate понять, что я хочу одного направленного между многими пользователями и ролями. Я не хочу получать всех пользователей со стороны таблицы ролей. В приведенной ниже конфигурации, когда я пытаюсь вставить новое значение в таблицу Users, вместо того, чтобы использовать существующие значения из ролей, он вставляет новое значение, создающее повторяющиеся значения с разными идентификаторами. Есть ли у вас какие-либо предложения? Спасибо. Ниже приведены классы, которые я использую:
Сущность пользователя:
@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
}
Служба пользователя:
@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...
}
Служба роли:
@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...
}