【发布时间】:2020-03-27 18:08:27
【问题描述】:
我在AcademicYear 和subject 之间有一对多的关系(一个学年有很多科目)。
这是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;
}
当我尝试更新AcademicYear 的name 属性时,我发送了一个带有以下正文的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