在Spring中保存实体时,引用请求体中具有列的子实体。

huangapple go评论118阅读模式
英文:

Save entity in spring referencing child entity with a column in request body

问题

我有3个实体:User(用户)、Office(办公室)和Role(角色)。Role和Office已经存在于数据库中。

在SQL中,User实体使用其id引用Office,并使用其名称引用Role。SQL中的记录示例:

  1. Role
  2. 1 | USER
  3. Office
  4. 1 | Office 1
  5. User
  6. John | Doe | john.doe@mail.com | Password123 | 1 | USER
  7. 对于User
  8. 1 -> 引用Office
  9. USER -> 引用Role

Role实体:

  1. @Data
  2. @Entity
  3. @NoArgsConstructor
  4. @AllArgsConstructor
  5. @Table(name = "t_role")
  6. public class Role {
  7. @Id
  8. @GeneratedValue(strategy = GenerationType.IDENTITY)
  9. private Integer id;
  10. @Column(name = "name")
  11. private String name;
  12. }

Office实体:

  1. @Data
  2. @Entity
  3. @Table(name = "t_office")
  4. public class Office {
  5. @Id
  6. @GeneratedValue(strategy = GenerationType.IDENTITY)
  7. private Integer id;
  8. @Column(name = "name")
  9. private String name;
  10. }

User实体:

  1. @Data
  2. @Entity
  3. @Builder
  4. @Table(name = "t_user")
  5. public class User {
  6. @Id
  7. @GeneratedValue(strategy = GenerationType.IDENTITY)
  8. private Integer id;
  9. @Column(name = "first_name")
  10. private String firstName;
  11. @Column(name = "last_name")
  12. private String lastName;
  13. @Column(name = "email")
  14. private String email;
  15. @Column(name = "password")
  16. private String password;
  17. @ManyToOne(fetch = FetchType.LAZY, optional = false)
  18. @JoinColumn(name="role", referencedColumnName="name")
  19. private Role role;
  20. @ManyToOne(fetch = FetchType.LAZY, optional = false)
  21. @JoinColumn(name = "office_id", referencedColumnName="id")
  22. private Office office;
  23. }

问题是:如何在不在请求体中指定所有Office和Role对象的情况下保存User?只需使用Office的id和Role的名称?也许需要使用DTO或Deserializer?

提前感谢。

我需要一个请求体如下:

  1. {
  2. "firstName": "John",
  3. "lastName": "Doe",
  4. "email": "john.doe@mail.com",
  5. "password": "Password123",
  6. "officeId": 1,
  7. "role": "USER"
  8. }

而不是一个请求体如下:

  1. {
  2. "firstName": "John",
  3. "lastName": "Doe",
  4. "email": "john.doe@mail.com",
  5. "password": "Password123",
  6. "office": {
  7. "id": 1,
  8. "name": "Office 1"
  9. },
  10. "role": {
  11. "id": 1,
  12. "name": "USER"
  13. }
  14. }
英文:

I have 3 entities: User, Office and Role. The Role and Office already exist in database.

In SQL the User entity references Office with its id and references Role with its name. Example of a record in SQL:

  1. Role table:
  2. 1 | USER
  3. Office table:
  4. 1 | Office 1
  5. User table:
  6. John | Doe | john.doe@mail.com | Password123 | 1 | USER
  7. For user table:
  8. 1 -> reference to Office
  9. USER -> reference to Role

Role entity:

  1. @Data
  2. @Entity
  3. @NoArgsConstructor
  4. @AllArgsConstructor
  5. @Table(name = "t_role")
  6. public class Role {
  7. @Id
  8. @GeneratedValue(strategy = GenerationType.IDENTITY)
  9. private Integer id;
  10. @Column(name = "name")
  11. private String name;
  12. }

Office entity:

  1. @Data
  2. @Entity
  3. @Table(name = "t_office")
  4. public class Office {
  5. @Id
  6. @GeneratedValue(strategy = GenerationType.IDENTITY)
  7. private Integer id;
  8. @Column(name = "name")
  9. private String name;
  10. }

User entity:

  1. @Data
  2. @Entity
  3. @Builder
  4. @Table(name = "t_user")
  5. public class User {
  6. @Id
  7. @GeneratedValue(strategy = GenerationType.IDENTITY)
  8. private Integer id;
  9. @Column(name = "first_name")
  10. private String firstName;
  11. @Column(name = "last_name")
  12. private String lastName;
  13. @Column(name = "email")
  14. private String email;
  15. @Column(name = "password")
  16. private String password;
  17. @ManyToOne(fetch = FetchType.LAZY, optional = false)
  18. @JoinColumn(name="role", referencedColumnName="name")
  19. private Role role;
  20. @ManyToOne(fetch = FetchType.LAZY, optional = false)
  21. @JoinColumn(name = "office_id", referencedColumnName="id")
  22. private Office office;
  23. }

The question is: How can I achieve saving a User without specifying all the Office and Role object in request body, but just the id for Office and name for Role ? Maybe it is needed to use a DTO or a Deserializer ?
Thanks in advance.

I need a request body like this:

  1. {
  2. "firstName": "John",
  3. "lastName": "Doe",
  4. "email": "john.doe@mail.com",
  5. "password": "Password123",
  6. "officeId": 1,
  7. "role": "USER"
  8. }

Instead of a request body like this:

  1. {
  2. "firstName": "John",
  3. "lastName": "Doe",
  4. "email": "john.doe@mail.com",
  5. "password": "Password123",
  6. "office": {
  7. "id": 1,
  8. "name": "Office 1"
  9. },
  10. "role": {
  11. "id": 1,
  12. "name": "USER"
  13. }
  14. }

答案1

得分: 2

是的,您需要使用DTO类来处理请求体部分。

  1. public class UserDTO {
  2. private String firstName;
  3. private String lastName;
  4. private String email;
  5. private String password;
  6. private String role;
  7. private Integer officeId;
  8. }

然后从数据库中获取办公室和角色的数据,并将数据设置到用户对象中,然后保存。例如:

  1. User user = convertUserDTOtoUser(userDTO);
  2. Optional<Office> office = officeRepository.findById(userDTO.getOfficeId());
  3. Role role = roleRepository.findByName(userDTO.getRole());
  4. user.setOffice(office);
  5. user.setRole(role);
  6. userRepository.save(user);

请注意,这是Java代码示例,用于处理请求体部分并与数据库交互。

英文:

Yes, you need to use a DTO class for the request body

  1. public class UserDTO {
  2. private String firstName;
  3. private String lastName;
  4. private String email;
  5. private String password;
  6. private String role;
  7. private Integer officeId;
  8. }

and fetch the data from the database for office and role from database and set the data in the user and then save. Ex:

  1. User user = convertUserDTOtoUser(userDTO);
  2. Optional&lt;Office&gt; office = officeRepository.findById(userDTO.getOfficeId());
  3. Role role = roleRepository.findByName(userDTO.getRole());
  4. user.setOffice(office);
  5. user.setRole(role);
  6. userRepository.save(user);

huangapple
  • 本文由 发表于 2020年8月2日 15:00:13
  • 转载请务必保留本文链接:https://go.coder-hub.com/63213266.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定