Сохранить объект в Spring, ссылаясь на дочерний объект со столбцом в теле запроса - PullRequest
0 голосов
/ 02 августа 2020

У меня есть 3 объекта: Пользователь, Офис и Роль. Роль и Office уже существуют в базе данных.

В SQL объект User ссылается на Office с его идентификатором и ссылается на Role с его именем. Пример записи в SQL:

Role table:
1 | USER

Office table:
1 | Office 1

User table:
John | Doe | john.doe@mail.com | Password123 | 1 | USER

For user table:
1 -> reference to Office
USER -> reference to Role

Ролевой объект:

@Data
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "t_role")
public class Role {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

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

Офисный объект:

@Data
@Entity
@Table(name = "t_office")
public class Office {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

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

Пользовательский объект:

@Data
@Entity
@Builder
@Table(name = "t_user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

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

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

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

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

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name="role", referencedColumnName="name")
    private Role role;

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "office_id", referencedColumnName="id")
    private Office office;
}

Возникает вопрос: как добиться сохранения пользователя, не указывая в теле запроса все объекты Office и Role, а только идентификатор Office и имя роли? Может быть нужно использовать DTO или десериализатор? Заранее спасибо.

Мне нужно тело запроса вроде этого:

{
  "firstName": "John",
  "lastName": "Doe",
  "email": "john.doe@mail.com",
  "password": "Password123",
  "officeId": 1,
  "role": "USER"
}

Вместо тела запроса вроде этого:

{
  "firstName": "John",
  "lastName": "Doe",
  "email": "john.doe@mail.com",
  "password": "Password123",
  "office": {
    "id": 1,
    "name": "Office 1"
  },
  "role": {
    "id": 1,
    "name": "USER"
  }
}

1 Ответ

2 голосов
/ 02 августа 2020

Да, вам нужно использовать класс DTO для тела запроса

public class UserDTO {
    private String firstName;

    private String lastName;

    private String email;

    private String password;

    private String role;

    private Integer officeId;
}

и извлекать данные из базы данных для офиса и роли из базы данных и устанавливать данные для пользователя, а затем сохранять. Пример:

User user = convertUserDTOtoUser(userDTO);
Optional<Office> office = officeRepository.findById(userDTO.getOfficeId());
Role role = roleRepository.findByName(userDTO.getRole());
user.setOffice(office);
user.setRole(role);
userRepository.save(user);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...