当前位置: 首页 > 知识库问答 >
问题:

hibernate递归Json响应[重复]

段兴为
2023-03-14

我正在使用hibernate在两个java对象中映射两个数据库表。我使用@OneToMany和@ManyToMany hibernate注释,而不是用Java中的属性表示表的外键。问题是,当我想要得到对象的Json列表时,我得到了递归关系。

这是“父”对象客户。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();
  }
}

这个对象有一个List,它是子对象的列表。现在Pratica.java类:

@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();
  }
}

我使用Daos保存了一些客户和Pratica对象:

//******
    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"));

但是当我想获取列表或JSON格式的列表时,我得到了递归关系。

[{"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-...

注释中有错误吗?或者使用@OneToMany和@ManyToOne是正常的吗?有没有办法得到一个最好的JSON来表示更好的表?

共有1个答案

公孙阳羽
2023-03-14

多亏了S.Y.Wang,这是Jackson JSON和Hibernate JPA问题无限递归的翻版

所以解决这个递归的方法是使用两个注释:

@JsonManagedReference 

接近父对象中的@OneTo很多注释,并且

@JsonBackReference

在子对象中接近@ManyToOne注释以在使用JacksonLibrary时阻止递归。

 类似资料:
  • 我得到了错误下的无限递归。 下面是我的代码 另一个班 我无法理解为什么在UI上获取此值时会出现此错误。

  • 如何在javascript中递归循环json对象数据键。 请检查以下json对象:

  • 问题内容: 当尝试将具有双向关联的JPA对象转换为JSON时,我不断 我所发现的只是该线程,基本上以建议避免双向关联为结尾。有谁知道这个春季错误的解决方法? ------编辑2010-07-24 16:26:22 ------- 代码段: 业务对象1: 业务对象2: 控制器: JPA实施学员DAO: persistence.xml 问题答案: 您可以使用它来打破循环。

  • 当尝试将具有双向关联的JPA对象转换为JSON时,我不断得到 我所发现的就是这条线索,它的基本结论是建议避免双向关联。有没有人有办法解决这个spring bug? ------编辑2010-07-24 16:26:22------- 代码片段: 业务对象1: 业务对象2: 控制器: JPA-见习DAO的实施: 坚持不懈xml

  • 问题内容: 我正在hibernate中编写一个函数以递归方式初始化对象的所有属性,以便加载整个对象图。 我有两个需要使用的复杂场景 1)自复合对象,例如类别和子类别… 2)复杂的对象图,其中有很多对象需要初始化才能使用。 问题是我不能使用急切的获取,因为我仅在特定情况下才需要整个对象图,而且我想拥有通用代码,因此不需要为对象编写HQL查询。 我为此写了一些代码, 但是它有一个问题,由于双向关系,它

  • 问题内容: 尝试将具有双向关联的JPA对象转换为JSON时,我不断 我所发现的只是该线程,基本上以建议避免双向关联为结尾。有谁知道这个Spring错误的解决方法? 代码段: 业务对象1: 业务对象2: 控制器: JPA实施学员DAO: persistence.xml 问题答案: 你现在可以使用JsonIgnoreProperties到属性(序列化过程中)的抑制序列,或忽略JSON性能的处理读取(反