【问题标题】:Spring JPA one-to-many relationship return null on updateSpring JPA 一对多关系在更新时返回 null
【发布时间】:2020-03-27 18:08:27
【问题描述】:


我在AcademicYearsubject 之间有一对多的关系(一个学年有很多科目)。 这是AcademicYear的模型:

package com.sms.entity;

import javax.persistence.*;

import com.fasterxml.jackson.annotation.JsonManagedReference;
import org.hibernate.annotations.UpdateTimestamp;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.Date;
import java.util.Set;

@Entity
@Setter
@Getter
@Table(name = "academic_years")
@NoArgsConstructor
@AllArgsConstructor
public class AcademicYear {

    public AcademicYear(long id, String name, Date updatedAt) {
        this.id = id;
        this.name = name;
        this.updatedAt = updatedAt;
    }

    @Schema(description = "Unique identifier of the academic year.", example = "1")
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Schema(description = "Name of the Academic Year.", example = "First Year Primary", required = true)
    @Column(name = "name")
    private String name;

    @JsonManagedReference
    @OneToMany(mappedBy="academicYear", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private Set<Subject> subjects;

    @UpdateTimestamp
    @Column(name = "updated_at", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
    private Date updatedAt;

    public Set<Subject> getSubjects() {
        return subjects;
    }

    public void setSubjects(Set<Subject> subjects) {
        this.subjects = subjects;
    }

}

还有Subject的型号:

package com.sms.entity;

import javax.persistence.*;

import com.fasterxml.jackson.annotation.JsonBackReference;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import java.util.Date;

@Table(name = "subjects")
@Entity
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Subject {

    public Subject(long id, String name, Date updatedAt) {
        this.id = id;
        this.name = name;
        this.updatedAt = updatedAt;
    }

    @Schema(description = "Unique identifier of the subject.", example = "1")
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Schema(description = "name of the subject.", example = "Mathematics-2")
    @Column(name = "name")
    private String name;

    @ManyToOne(cascade = {CascadeType.ALL})
    @JsonBackReference
    @JoinColumn(name="academic_year_id", nullable=false)
    private AcademicYear academicYear;

    @UpdateTimestamp
    @Column(name = "updated_at", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
    private Date updatedAt;

}

当我尝试更新AcademicYearname 属性时,我发送了一个带有以下正文的PUT 请求:

{
    "id": 2,
    "name": "Second Year"
}

我收到以下回复:

{
    "id": 2,
    "name": "Second Year",
    "subjects": null,
    "updatedAt": "2020-03-27T18:01:16.163+0000"
}

我有subjects 作为null。这个 AcademicYear 实体已经有记录,当我发送带有 2 作为路径变量的 GET 请求以获取实体时,我得到以下响应:

{
    "id": 2,
    "name": "Second Year",
    "subjects": [
        {
            "id": 3,
            "name": "english",
            "updatedAt": "2020-03-27T17:39:09.000+0000"
        },
        {
            "id": 4,
            "name": "physics",
            "updatedAt": "2020-03-26T21:45:09.000+0000"
        },
        {
            "id": 5,
            "name": "chemistry",
            "updatedAt": "2020-03-26T21:45:09.000+0000"
        },
        {
            "id": 2,
            "name": "math",
            "updatedAt": "2020-03-27T17:39:09.000+0000"
        }
    ],
    "updatedAt": "2020-03-27T18:01:16.000+0000"
}

我的获取类型为EAGER,不知道为什么我在更新实体名称时将subjects 设置为null。有什么帮助吗?

【问题讨论】:

    标签: spring jpa spring-data-jpa


    【解决方案1】:

    您需要使用PATCH 而不是PUT 进行部分更新。

    这就是原因

    根据 RFC 7231,PUT 应仅用于在幂等操作中完全替换表示。 PATCH 应该用于部分更新。

    根据您的输入,请求将 null 设置为主题。 如果您仍想使用 PUT,则需要提供要更新/替换的整个请求对象

    您可以在此处找到更多详细信息 Why isn't HTTP PUT allowed to do partial updates in a REST API?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-26
      • 2019-07-24
      • 1970-01-01
      • 2013-10-21
      • 2016-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多