通过REST API创建子对象时传递父ID引用

时间:2019-01-24 13:09:19

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

我正在使用Spring Boot(版本-2.1.1)。我有一个通过rest api进行CRUD操作的一对多数据库模型。该模型如下所示。如何配置POST /departments api(创建部门对象)以仅接受输入json正文中的组织ID?

@PostMapping
    public Long createDepartment(@RequestBody Department Department) {
        Department d = departmentService.save(Department);
        return d.getId();
    }

注意-我不想在创建部门时允许创建组织对象。

模型对象映射

@Entity
@Table(name="ORGANIZATIONS")
public class Organization{

    @Id
    @GeneratedValue
    Private long id;

    @Column(unique=true)
    Private String name;

    @OneToMany(mappedBy = "organization", fetch = FetchType.EAGER)
    private List<Department> departments;
}


@Entity
@Table(name="DEPARTMENTS")
Public class Department{

   @Id
   @GeneratedValue
   Private long id;

   @Column(unique=true)
   Private String name;

   @ManyToOne(fetch = FetchType.EAGER)
   private Organization organization;
}

谢谢!

1 个答案:

答案 0 :(得分:2)

在我看来,最简单,最明智的方法就是利用DTO(数据传输对象)模式。

创建一个代表要输入的模型的类:

public class CreateDepartmentRequest {
    private long id;

    // getters and setters
}

然后在您的控制器中使用它:

@PostMapping
public Long createDepartment(@RequestBody CreateDepartmentRequest request) {
    Department d = new Department();
    d.setId(request.getId());
    Department d = departmentService.save(d);
    return d.getId();
}

旁注,它最好总是通过REST API返回JSON(除非您在API中使用其他格式),因此您还可以利用与我上面提到的相同的模式作为POST操作的结果返回正确的模型或一个简单的Map(如果您不想创建多个模型)。