【问题标题】:Save entity in spring referencing child entity with a column in request body在spring中保存实体,在请求正文中使用一列引用子实体
【发布时间】:2020-11-22 13:34:24
【问题描述】:

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

在 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 或 Deserializer ? 提前致谢。

我需要这样的请求正文:

{
  "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"
  }
}

【问题讨论】:

    标签: java json spring-boot rest spring-data-jpa


    【解决方案1】:

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

    【讨论】:

    • 这不会在数据库中创建太多调用吗?
    • 如果不获取role & office,则无法在用户中设置。同样重要的是role & office 是否存在于数据库中以进行验证。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多