Spring boot @未映射Spring引导控制器中特定实体的Id

Spring boot @未映射Spring引导控制器中特定实体的Id,spring-boot,jackson,spring-web,Spring Boot,Jackson,Spring Web,我有两个实体Employee和Department,每个实体都有一个SpringWeb@RestController带更新方法的注释类,即Http PUT 出于某种奇怪的原因(可能是一个非常明显的解决方案),每当为Employee类调用PUT时,JSON负载中的ID不会映射到Employee实体的ID类,但它对部门实体非常有效 员工类别: Entity @Table(name = "EMPLOYEE") public class Employee implements Serializable,

我有两个实体
Employee
Department
,每个实体都有一个SpringWeb
@RestController
带更新方法的注释类,即
Http PUT

出于某种奇怪的原因(可能是一个非常明显的解决方案),每当为
Employee
类调用
PUT
时,JSON负载中的ID不会映射到
Employee
实体的
ID
类,但它对
部门
实体非常有效

员工
类别:

Entity
@Table(name = "EMPLOYEE")
public class Employee implements Serializable, Identity<Long>, Deleted
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

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

    @ManyToOne
    @Where(clause = "is_deleted = false")
    private Department department;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "EMP_QUAL", joinColumns = @JoinColumn(name = "EMPLOYEE_ID"), inverseJoinColumns = @JoinColumn(name = "QUALIFICATION_ID"))
    @WhereJoinTable(clause = "IS_DELETED = false")
    @SQLDelete(sql = "UPDATE `EMP_QUAL` SET IS_DELETED = true where EMPLOYEE_ID = ? and QUALIFICATION_ID = ? and IS_DELETED = False")
    private Set<Qualification> qualifications;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "EMP_PROJ", joinColumns = @JoinColumn(name = "emp_id"), inverseJoinColumns = @JoinColumn(name = "proj_id"))
    @Where(clause = "is_deleted = false")
    private Set<Project> projects;

    @JsonIgnore
    @Column(name = "is_deleted", nullable = false)
    private Boolean isDeleted = false;

    @Override
    public Long getId()
    {
        return this.id;
    }

    @Override
    public void setId(final Long id)
    {
        this.id = id;
    }

    public String getName()
    {
        return name;
    }

    public void setName(final String name)
    {
        this.name = name;
    }

    public Set<Project> getProjects()
    {
        return projects;
    }

    public void setProjects(final Set<Project> projects)
    {
        this.projects = projects;
    }

    public Department getDepartment()
    {
        return department;
    }

    public void setDepartment(final Department department)
    {
        this.department = department;
    }

    public Set<Qualification> getQualifications()
    {
        return qualifications;
    }

    public void setQualifications(final Set<Qualification> qualifications)
    {
        this.qualifications = qualifications;
    }

    public Boolean isDeleted()
    {
        return isDeleted;
    }

    public void setDeleted(final Boolean deleted)
    {
        isDeleted = deleted;
    }

}
@Entity
@Table(name = "DEPARTMENT")
public class Department implements Serializable, Identity<Long>, Deleted
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

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

    @OneToMany(fetch = FetchType.EAGER)
    @WhereJoinTable(clause = "is_deleted = false")
    @JoinTable(name = "DEPARTMENT_EMPLOYEE", joinColumns = {@JoinColumn(name = "department_id")},
            inverseJoinColumns = {@JoinColumn(name = "employee_id")})
    @SQLDelete(sql = "UPDATE DEPARTMENT_EMPLOYEE SET is_deleted = true where department_id = ? and employee_id = ? and is_deleted = false")
    private Set<Employee> departmentMembers;

    @Column(name = "is_deleted", nullable = false)
    private Boolean isDeleted;

    @Override
    public Long getId()
    {
        return this.id;
    }

    @Override
    public void setId(final Long id)
    {
        this.id = id;
    }

    @Override
    public Boolean isDeleted()
    {
        return this.isDeleted;
    }

    @Override
    public void setDeleted(final Boolean isDeleted)
    {
        this.isDeleted = isDeleted;
    }

    public String getName()
    {
        return name;
    }

    public void setName(final String name)
    {
        this.name = name;
    }

    public Set<Employee> getDepartmentMembers()
    {
        return departmentMembers;
    }

    public void setDepartmentMembers(final Set<Employee> departmentMembers)
    {
        this.departmentMembers = departmentMembers;
    }
}
调用
PUT/employees/{id}
时:

调用
PUT/departments/{id}

正如您在调试器的屏幕截图中所看到的,
部门
id
字段被填充,而
员工
中该字段为空。我正在用Swagger进行测试,并在有效载荷中设置ID。我没有任何特定的Jackson配置集,我只是使用Spring boot的默认设置,但我无法理解为什么只有在Employee中,
id
字段从未映射

员工
身体:

{
"id":1,
  "name": "New Name"
}
{
"id":2,
  "name": "chemistry",
"deleted":false
}
部门
机构:

{
"id":1,
  "name": "New Name"
}
{
"id":2,
  "name": "chemistry",
"deleted":false
}

该问题是由于另一个与
员工
有关系的实体
项目
上的Jackson注释引起的:

@Entity
@Table(name = "PROJECT")
public class Project implements Serializable, Identity<Long>, Deleted
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

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

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "EMP_PROJ", joinColumns = @JoinColumn(name = "proj_id"), inverseJoinColumns = @JoinColumn(name = "emp_id"))
    @JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "id")
    @Where(clause = "is_deleted = false")
    private Set<Employee> employees;
@实体
@表(name=“项目”)
公共类项目实现可序列化、标识、删除
{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@列(name=“name”)
私有字符串名称;
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name=“EMP\u PROJ”,joinColumns=@JoinColumn(name=“PROJ\u id”),inverseJoinColumns=@JoinColumn(name=“EMP\u id”))
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class,property=“id”)
@其中(子句=“已删除=错误”)
私人雇员;

您要传递给调用的主体是什么?@NiVeR使用主体数据更新。接口
删除的
标识
来自哪里?它们由我定义。它们只声明getter和setter,两个实体都实现它们