将实体保存在spring中,引用请求正文中具有列的子实体



我有三个实体:用户、办公室和角色。数据库中已存在角色和办公室。

在SQL中,用户实体用其id引用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的id和Role的名称,我如何实现保存用户?也许需要使用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"
}
}

是的,您需要为请求主体使用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);

最新更新