Създадох примерно приложение jHipster ( url: http://jhipster.github.io/creating_an_app.html), използвайки подгенератор на обект, създадох обект Събитие, който има връзка OneToMany с EventImages , EventTickets и EventQuestions, когато извлека всички (приложение, работещо на локална машина, url на API: http://127.0.0.1:8080/api/събития ) събития Не можах да намеря данни за EventImages, EventTickets и EventQuestions в отговор.
Обект на събитие
@Entity
@Table(name = "JHI_EVENT")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Event implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
/* other fields */
@OneToMany(mappedBy = "event")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@JsonIgnore
private Set<EventTicket> eventTickets = new HashSet<>();
@OneToMany(mappedBy = "event")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@JsonIgnore
private Set<EventImage> eventImages = new HashSet<>();
@OneToMany(mappedBy = "event")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@JsonIgnore
private Set<EventQuestion> eventQuestions = new HashSet<>();
/* getter and setters */
}
Обект EventImages
@Entity
@Table(name = "JHI_EVENTIMAGE")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class EventImage implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "image_url")
private String imageUrl;
@ManyToOne
private Event event;
/* getters and setters */
}
по подобен начин, обекти EventTickets и EventQuestions.
След известно проучване открих, че трябва да премахна анотацията @JsonIgnore, за да заредя данни от OneToMany Collections с помощта на мързеливо извличане, отговорът, който получих, е null за EventImage, EventTicket и EventQuestions, както е показано по-долу.
[ {
"id": 1,
"title": "First Event",
"eventVenue": "xyz",
"startDate": "2015-05-28T10:10:00Z",
"endDate": "2015-06-20T10:10:00Z",
"eventTickets": null,
"eventImages": null,
"eventQuestions": null
} ]
След това открих, че трябва да използвам @JsonManagedReference и @JsonBackReference за връзката родител/дете, но трябва да използвам fetch = Fetch.EAGAR (искам да заредя OneToMany колекции, когато задам FetchType.LAZY, което е по подразбиране, като при извикване на обект Събитие).
Обект на събитие, когато използвах @JsonManagedReference
@Entity
@Table(name = "JHI_EVENT")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Event implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
/* other fields */
@OneToMany(mappedBy = "event", fetch = FetchType.EAGER)
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@JsonManagedReference
private Set<EventTicket> eventTickets = new HashSet<>();
@OneToMany(mappedBy = "event", fetch = FetchType.EAGER)
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@JsonManagedReference
private Set<EventImage> eventImages = new HashSet<>();
@OneToMany(mappedBy = "event", fetch = FetchType.EAGER)
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@JsonManagedReference
private Set<EventQuestion> eventQuestions = new HashSet<>();
/* getter and setters */
}
Обект EventImage, когато използвах @JsonBackReference
@Entity
@Table(name = "JHI_EVENTIMAGE")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class EventImage implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "image_url")
private String imageUrl;
@ManyToOne
@JsonBackReference
private Event event;
/* getters and setters */
}
Как да заредите OneToMany колекции мързеливо, т.е. EventImages, EventTickets и EventQuestions в отговор, когато обектът на събитие е поискан, т.е. http://127.0.0.1:8080/api/events Извършва се REST повикване.
Благодаря