多对多/循环参考问题Jackson+Spring+Hibernate



Course.java

@Entity
@Table
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class Course {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @NotEmpty
    private String description;
    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "subject_course", joinColumns = @JoinColumn(name = "subject_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "course_id", referencedColumnName = "id"))
    private Set<Subject> subjects = new HashSet<Subject>();
    ---- getter/setter ----

主题.java

@Entity
@Table
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class Subject {
    @Id
    @Column
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String description;
    @ManyToMany(mappedBy = "subjects", fetch=FetchType.EAGER)
    @Cascade({CascadeType.DELETE, CascadeType.SAVE_UPDATE})
    private Set<Course> courses = new HashSet<Course>();
    ---- getter/setter ----

春季请求配置:

@RequestMapping(value = "/courses", method = RequestMethod.GET)
public @ResponseBody ResponseEntity<?> getAllCourses() {
    List<Course> courses = courseService.getAllCourses();
    if (courses.isEmpty()) {
        return new ResponseEntity<Message>(new Message("error", "No course found!"), HttpStatus.NOT_FOUND);
    }
    return new ResponseEntity<List<Course>>(courses, HttpStatus.OK);
}

休眠版本:4.2.0.最终版本
春季版本:3.2.8.RELEASE
Jackson:

 <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.2.4</version>
 </dependency>

预期O/p

 [{
      "id": 1,
      "description": "BCA",
      "subjects":[{
           "id":1,
           "description":"Physics",
           "courses":[1,2,3] //Either show blank array or only ids
      }]
 },{
      "id": 2,
      "description": "BSC",
      "subjects":[{
           "id":1,
           "description":"Physics",
           "courses":[1,2,3]
      }]
 },{
      "id": 3,
      "description": "BA",
      "subjects":[{
           "id":1,
           "description":"Physics",
           "courses":[1,2,3]
      }]
 },]

但是获得O/p:

 [
   {
     "id": 1,
     "description": "BCA",
     "subjects": [
       {
         "id": 1,
         "description": "Math",
         "staffs": [],
         "courses": [
           {
             "id": 4,
             "description": "BDA",
             "subjects": [
               1
             ],
             "students": []
           },
           {
             "id": 3,
             "description": "BBA",
             "subjects": [
               1
             ],
             "students": []
           },
           1
         ],
         "students": []
       }
     ],
     "students": [
       {
         "id": 1,
         "name": "",
         "age": 0,
         "gender": null,
         "course": 1,
         "subjects": []
       }
     ]
   },
   3,
   4
 ]

根据实际的o/p,它在第二级停止递归。但我的要求是不要重复来自子对象的相同对象数据。。。这意味着课程不得在Subject的课程属性中重复其数据。类似地,如果从Subject调用相同的,则Subject不应重复Course Subject属性值。最好跳过,如果不能,则只显示用逗号分隔的id值。

请告知如何解决此问题。

您可以在Subject类中使用@JsonIgnore,如下所示:

@ManyToMany(mappedBy = "subjects", fetch=FetchType.EAGER)
@Cascade({CascadeType.DELETE, CascadeType.SAVE_UPDATE})
@JsonIgnore
private Set<Course> courses = new HashSet<Course>();

最新更新