Problema: una relazione One-to-Many bidirezionale di Hibernate non è facilmente associabile a JSON. Se viene utilizzata la mappatura predefinita (Jackson), esiste un problema di ricorsione infinito in quanto il genitore contiene i figli, ognuno dei quali contiene un riferimento al genitore. Il modo più semplice che ho trovato per risolvere questo problema è contrassegnare l'attributo Many end come @JsonIgnore. Ciò significa che il JSON viene generato come previsto. Tuttavia, quando gli oggetti vengono inviati su un POST REST (ad esempio), ciò significa che i riferimenti ManyToOne vengono persi. Al momento ho solo il servizio REST per ricostruire i riferimenti prima di mantenere i dati, ma mi chiedo se c'è un modo consigliato per farlo automaticamente (usando l'architettura Spring REST).
Per illustrare, ecco alcuni frammenti di codice:
L'entità padre:
@Entity
@Table(name = "wine_case")
public class WineCase {
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "wineCase")
private List<CaseContent> caseContents;
}
L'entità figlio:
@Entity
@Table(name = "case_content")
public class CaseContent {
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "wine_case_id", nullable = false)
@JsonIgnore
private WineCase wineCase;
}
Il metodo nel controller REST che riceve la richiesta e deve ricostruire le relazioni da CaseContent a WineCase:
@RequestMapping(method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public @ResponseBody
WineCase createWineCase(@RequestBody WineCase wineCase, HttpServletResponse response) {
wineCase.setId(null);
wineCase.getCaseContents().forEach((cc) -> cc.setWineCase(wineCase));
entityManager.persist(wineCase);
response.setHeader("Location", "/winecases/" + wineCase.getId());
return wineCase;
}