1

I'm mapping two database tables in two java objects using hibernate. Instead of representing the foreign keys of the tables with an attribute in Java I use @OneToMany and @ManyToMany hibernate annotations. The problem is that when I want to get the Json list of the objects I get the recursive relationship.

Here is the "parent" object Cliente.java

@Entity @Table(name="clienti")
@AllArgsConstructor @NoArgsConstructor @Data
public class Cliente {

  @Id @Column(name="idcliente") @NotBlank
  private String idCliente;              

  @Column(name="ragionesociale")
  private String ragioneSociale;  

  @Column(name="nominativo") @NotBlank
  private String nominativo;      

  @Column(name="indirizzo")
  private String indirizzo;

  @Column(name="telefono")
  private String telefono;

  @Column(name="email")
  private String email;

  @Column(name="sito")
  private String sito;

  @Column(name="segnalatore")
  private String segnalatore;

  @Column(name="attivita")
  private String attivita;

  @Column(name="interessatoa")
  private String interessatoA;

  @OneToMany(mappedBy="cliente")
  private List<Pratica> pratiche;

  @Column(name="registratoda")
  private String registratoDa;    

  @Column(name="data")
  private Date data;

  @Column(name="note")
  private String note;

  @PrePersist
  private void salvaData(){
    data = new Date();
  }
}

This object has a List which is a list of child objects. Now The Pratica.java class:

@Entity @Table(name="pratiche")
@AllArgsConstructor@NoArgsConstructor @lombok.Data
public class Pratica {

  @Id @Column(name="idpratica")
  private String idPratica;

  @Column(name="descrizione")
  private String descrizione;

  @Column(name="note")
  private String note;

  @Column(name="data")
  private Date data;

  @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="idcliente", nullable=false)
  private Cliente cliente;

  @Column(name="registratoDa")
  private String registratoDa;

  @PrePersist
  private void setCampi(){
    data = new Date();
    idPratica = data.toInstant().toString() + cliente.getIdCliente();
  }
}

I've saved some Cliente and Pratica objects using my Daos:

//******
    clienteDao.save(new Cliente("IDCLIENTE_1", "RAGIONESOCIALE_1", "NOMINATIVO_1", "INDIRIZZO_1", "TELEFONO_1", "EMAIL_1", "SITO_1", "SEGNALATORE_1", "ATTIVITA_1", "INTERESSATOA_1", null, "RGNLSN87H13D761R", null, "NOTE_1"));
    clienteDao.save(new Cliente("IDCLIENTE_2", "RAGIONESOCIALE_2", "NOMINATIVO_2", "INDIRIZZO_2", "TELEFONO_2", "EMAIL_2", "SITO_2", "SEGNALATORE_2", "ATTIVITA_2", "INTERESSATOA_2", null, "RGNLSN87H13D761R", null, "NOTE_2"));
    clienteDao.save(new Cliente("IDCLIENTE_3", "RAGIONESOCIALE_3", "NOMINATIVO_3", "INDIRIZZO_3", "TELEFONO_3", "EMAIL_3", "SITO_3", "SEGNALATORE_3", "ATTIVITA_3", "INTERESSATOA_3", null, "RGNLSN8UTED761R", null, "NOTE_3"));
//******
    praticaDao.save(new Pratica("IDPRATICA_1", "DESCRIZIONE_1", null, "NOTE_1", null, clienteDao.getOne("IDCLIENTE_1"), "RGNDCN8DUYD761R"));
    praticaDao.save(new Pratica("IDPRATICA_2", "DESCRIZIONE_2", null, "NOTE_2", null, clienteDao.getOne("IDCLIENTE_1"), "RGNLS32H13D761R"));

    praticaDao.save(new Pratica("IDPRATICA_3", "DESCRIZIONE_3", null, "NOTE_3", null, clienteDao.getOne("IDCLIENTE_2"), "RGNLKIU87H13D761R"));
    praticaDao.save(new Pratica("IDPRATICA_4", "DESCRIZIONE_4", null, "NOTE_4", null, clienteDao.getOne("IDCLIENTE_2"), "RGNTGH7H13D761R"));

    praticaDao.save(new Pratica("IDPRATICA_5", "DESCRIZIONE_5", null, "NOTE_5", null, clienteDao.getOne("IDCLIENTE_3"), "RGNLGTR13D761R"));
    praticaDao.save(new Pratica("IDPRATICA_6", "DESCRIZIONE_6", null, "NOTE_6", null, clienteDao.getOne("IDCLIENTE_3"), "RGNLSNHYDFR3D761R"));

But when I want to get the List or the List in JSON format I get the recursive relationship.

[{"idCliente":"IDCLIENTE_1","ragioneSociale":"RAGIONESOCIALE_1","nominativo":"NOMINATIVO_1","indirizzo":"INDIRIZZO_1","telefono":"TELEFONO_1","email":"EMAIL_1","sito":"SITO_1","segnalatore":"SEGNALATORE_1","attivita":"ATTIVITA_1","interessatoA":"INTERESSATOA_1","pratiche":[{"idPratica":"2018-03-21T21:27:05.582ZIDCLIENTE_1","descrizione":"DESCRIZIONE_1","documenti":[],"note":"NOTE_1","data":"2018-03-21T21:27:05.582+0000","cliente":{"idCliente":"IDCLIENTE_1","ragioneSociale":"RAGIONESOCIALE_1","nominativo":"NOMINATIVO_1","indirizzo":"INDIRIZZO_1","telefono":"TELEFONO_1","email":"EMAIL_1","sito":"SITO_1","segnalatore":"SEGNALATORE_1","attivita":"ATTIVITA_1","interessatoA":"INTERESSATOA_1","pratiche":[{"idPratica":"2018-03-21T21:27:05.582ZIDCLIENTE_1","descrizione":"DESCRIZIONE_1","documenti":[],"note":"NOTE_1","data":"2018-03-21T21:27:05.582+0000","cliente":{"idCliente":"IDCLIENTE_1","ragioneSociale":"RAGIONESOCIALE_1","nominativo":"NOMINATIVO_1","indirizzo":"INDIRIZZO_1","telefono":"TELEFONO_1","email":"EMAIL_1","sito":"SITO_1","segnalatore":"SEGNALATORE_1","attivita":"ATTIVITA_1","interessatoA":"INTERESSATOA_1","pratiche":[{"idPratica":"2018-03-21T21:27:05.582ZIDCLIENTE_1","descrizione":"DESCRIZIONE_1","documenti":[],"note":"NOTE_1","data":"2018-03-21T21:27:05.582+0000","cliente":{"idCliente":"IDCLIENTE_1","ragioneSociale":"RAGIONESOCIALE_1","nominativo":"NOMINATIVO_1","indirizzo":"INDIRIZZO_1","telefono":"TELEFONO_1","email":"EMAIL_1","sito":"SITO_1","segnalatore":"SEGNALATORE_1","attivita":"ATTIVITA_1","interessatoA":"INTERESSATOA_1","pratiche":[{"idPratica":"2018-03-21T21:27:05.582ZIDCLIENTE_1","descrizione":"DESCRIZIONE_1","documenti":[],"note":"NOTE_1","data":"2018-03-21T21:27:05.582+0000","cliente":{"idCliente":"IDCLIENTE_1","ragioneSociale":"RAGIONESOCIALE_1","nominativo":"NOMINATIVO_1","indirizzo":"INDIRIZZO_1","telefono":"TELEFONO_1","email":"EMAIL_1","sito":"SITO_1","segnalatore":"SEGNALATORE_1","attivita":"ATTIVITA_1","interessatoA":"INTERESSATOA_1","pratiche":[{"idPratica":"2018-03-21T21:27:05.582ZIDCLIENTE_1","descrizione":"DESCRIZIONE_1","documenti":[],"note":"NOTE_1","data":"2018-03-21T21:27:05.582+0000","cliente":{"idCliente":"IDCLIENTE_1","ragioneSociale":"RAGIONESOCIALE_1","nominativo":"NOMINATIVO_1","indirizzo":"INDIRIZZO_1","telefono":"TELEFONO_1","email":"EMAIL_1","sito":"SITO_1","segnalatore":"SEGNALATORE_1","attivita":"ATTIVITA_1","interessatoA":"INTERESSATOA_1","pratiche":[{"idPratica":"2018-03-...

Is there an error in the annotations or is it something normal using @OneToMany and @ManyToOne and there is a way to get a best JSON which represents better the table?

Alessandro Argentieri
  • 2,901
  • 3
  • 32
  • 62
  • 1
    I'd recommend you to not try to serialize entity to json due to such mistakes, instead of that make a pojo model. But if you really want that, try to use @JsonIgnore annotation – dzrkot Mar 22 '18 at 08:27

1 Answers1

1

Thanks to S.Y. Wang it is a duplicate of Infinite Recursion with Jackson JSON and Hibernate JPA issue

So the way to solve this recursion is to use the two annotations:

@JsonManagedReference 

close to @OneToMany annotation in the parent object and

@JsonBackReference

close to @ManyToOne annotation in the child object to block recursion while using JacksonLibrary.

Alessandro Argentieri
  • 2,901
  • 3
  • 32
  • 62