Ion*_*ert 11 java spring json hibernate
我有一个 Spring 应用程序,其中包含 2 个具有多对多关系的实体。有学生和团体。一个学生可以是许多组的一部分,一个组可以有许多学生。
学生模特
@Entity
@Table(name = "STUDENTS")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id")
public class Student extends AbstractUser {
//Fields
@ManyToMany(fetch = FetchType.LAZY, targetEntity = Group.class)
@JoinTable(name = "GROUPS_STUDENTS",
joinColumns = { @JoinColumn(name = "student_id") },
inverseJoinColumns = { @JoinColumn(name = "group_id") })
private List<Group> groups = new ArrayList<Group>();
//Constructors
public Student(String password, String firstName, String lastName, String email){
super(password, firstName, lastName, email);
}
public Student(){
}
//Setters and getters
public List<Group> getGroups() {
return groups;
}
public void setGroups(List<Group> groups) {
this.groups = groups;
}
}
Run Code Online (Sandbox Code Playgroud)
团体模式
@Entity
@Table(name = "GROUPS")
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id")
public class Group implements Item, Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name", nullable = false, unique = true)
private String name;
@Column(name = "year", nullable = false, length = 1)
private int year;
@ManyToMany(mappedBy = "groups", targetEntity = Student.class)
private List<Student> students;
public Group(String name, int yearOfStudy) {
this.setName(name);
this.setYear(yearOfStudy);
}
...
}
Run Code Online (Sandbox Code Playgroud)
问题是当我请求显示所有学生时,如果有 2 个学生在同一组中,他们会出现在一个层次结构中,而不是一个接一个。我的意思是 JSON 太深了。我不知道如何准确解释,但我会举一个例子。
它是如何出现的
@Entity
@Table(name = "STUDENTS")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id")
public class Student extends AbstractUser {
//Fields
@ManyToMany(fetch = FetchType.LAZY, targetEntity = Group.class)
@JoinTable(name = "GROUPS_STUDENTS",
joinColumns = { @JoinColumn(name = "student_id") },
inverseJoinColumns = { @JoinColumn(name = "group_id") })
private List<Group> groups = new ArrayList<Group>();
//Constructors
public Student(String password, String firstName, String lastName, String email){
super(password, firstName, lastName, email);
}
public Student(){
}
//Setters and getters
public List<Group> getGroups() {
return groups;
}
public void setGroups(List<Group> groups) {
this.groups = groups;
}
}
Run Code Online (Sandbox Code Playgroud)
它应该如何出现
@Entity
@Table(name = "GROUPS")
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id")
public class Group implements Item, Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name", nullable = false, unique = true)
private String name;
@Column(name = "year", nullable = false, length = 1)
private int year;
@ManyToMany(mappedBy = "groups", targetEntity = Student.class)
private List<Student> students;
public Group(String name, int yearOfStudy) {
this.setName(name);
this.setYear(yearOfStudy);
}
...
}
Run Code Online (Sandbox Code Playgroud)
你知道如何解决这个问题吗?我不知道如何确切地描述我的问题,这就是为什么我还没有找到解决方案的原因。任何帮助将不胜感激。谢谢你。
我已经解决了。我制作了一个自定义序列化程序。因此,在 Group 我将通过设置自定义注释@JsonSerialize(using = CustomStudentSerializer.class) 来序列化学生
自定义学生序列化程序
public class CustomStudentSerializer extends StdSerializer<List<Student>> {
public CustomStudentSerializer() {
this(null);
}
public CustomStudentSerializer(Class<List<Student>> t) {
super(t);
}
@Override
public void serialize(
List<Student> students,
JsonGenerator generator,
SerializerProvider provider)
throws IOException, JsonProcessingException {
List<Student> studs = new ArrayList<>();
for (Student s : students) {
s.setGroups(null);
studs.add(s);
}
generator.writeObject(studs);
}
}
Run Code Online (Sandbox Code Playgroud)
对组做了同样的事情。当关系已经嵌套时,我刚刚删除了学生/组组件。现在它工作得很好。
我花了一段时间才弄清楚这一点,但我在这里发帖是因为它也可能对其他人有所帮助。
使用@JsonIgnoreProperties注释是另一种选择:
@Entity
public class Student extends AbstractUser {
@ManyToMany(fetch = FetchType.LAZY, targetEntity = Group.class)
@JoinTable(name = "GROUPS_STUDENTS",
joinColumns = { @JoinColumn(name = "student_id") },
inverseJoinColumns = { @JoinColumn(name = "group_id") })
@JsonIgnoreProperties("students")
private List<Group> groups = new ArrayList<Group>();
}
@Entity
public class Group implements Item, Serializable {
@ManyToMany(mappedBy = "groups", targetEntity = Student.class)
@JsonIgnoreProperties("groups")
private List<Student> students;
}
Run Code Online (Sandbox Code Playgroud)
之间找到比较@JsonManagedReference+ @JsonBackReference,@JsonIdentityInfo并@JsonIgnoreProperties在这里:http://springquay.blogspot.com/2016/01/new-approach-to-solve-json-recursive.html
| 归档时间: |
|
| 查看次数: |
8948 次 |
| 最近记录: |