我调试了代码,变量“ empresasucursal”已嵌入了大量相同的信息,从而导致内存溢出。根据下图的数据库模型关联类的正确方法是什么

[![empresa_sucursal] [1]] [1]

Java Empresa类


@Entity
@Table(name = "empresa")
public class Empresa implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="idempresa")
private Integer idempresa;

@javax.persistence.Temporal(TemporalType.TIMESTAMP)
private Date fechaRegistro;

@Column(name="direccionFiscal")
private String direccion;

private String nombre;

@Column(name="contactoTelefonoCelular")
private String celular;

@Column(name="regimenUnicoContribuyente")
private String ruc;


private String estado;

private String codigoEmpresa;


@OneToMany(mappedBy="empresa")
private List<EmpresaSucursal> empresaSucursal;
}


类Java Sucursal


@Entity
@Table(name = "sucursal")
public class Sucursal implements Serializable{


@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "idsucursal")
private int idsucursal;

@Column(name = "nombreSucursal")
private String nombre;

private String direccion;

@Column(name = "contactoTelefonoFijo")
private String telefonoFijo;

private String fechaRegistro;

private String estado;

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

@OneToMany(mappedBy = "sucursal")
private List<EmpresaSucursal> empresaSucursal;
}


类Java EmpresaSucursal


@Entity
@Table(name = "empresa_sucursal")
public class EmpresaSucursal implements Serializable {

@Id
@ManyToOne
@JoinColumn(name = "idempresa",referencedColumnName="idempresa")
private Empresa empresa;

@Id
@ManyToOne
@JoinColumn(name = "idsucursal" ,referencedColumnName="idsucursal")
private Sucursal sucursal;

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

}


控制器方式


@RequestMapping(method = RequestMethod.GET, value = "/{empresaId}", produces
= MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public Empresa obtenerEmpresa(@PathVariable Integer empresaId) throws
EmpresaNotExistException{
    Empresa empresa =this.empresaRepository.findOne(empresaId);
    System.out.println(empresa.toString());
    return empresa;
}


控制台中的错误


  017-04-17 10:05:10.442警告9788 --- [nio-8080-exec-1]
  .w.s.m.s.DefaultHandlerExceptionResolver:编写HTTP失败
  信息:
  org.springframework.http.converter.HttpMessageNotWritableException:
  无法写入内容:无限递归(StackOverflowError)
  (通过参考链:
  com.gdata.auth.bean.Sucursal [“ empresaSucursal”]-> org.hibernate.collection.internal.PersistentSet [0]-> com.gdata.auth.bean.EmpresaSucursal [“ sucursal”]-> com.gdata。 auth.bean.Sucursal [“ empresaSucursal”]-> org.hibernate.collection.internal.PersistentSet [0]-> com.gdata.auth.bean.EmpresaSucursal [“ sucursal”]-> com.gdata.auth.bean。 Sucursal [“ empresaSucursal”]-> org.hibernate.collection.internal.PersistentSet [0]-> com.gdata.auth.bean.EmpresaSucursal [“ sucursal”]-> com.gdata.auth.bean.Sucursal [“ empresaSucursal “]-> org.hibernate.collection.internal.PersistentSet [0]-> com.gdata.auth.bean.EmpresaSucursal [” sucursal“]-> com.gdata.auth.bean.Sucursal [” empresaSucursal“]-> org.hibernate.collection.internal.PersistentSet [0]-> com.gdata.auth.bean.EmpresaSucursal [“ sucursal”]-> com.gdata.auth.bean.Sucursal [“ empresaSucursal”]-> org.hibernate。 collection.internal.PersistentSet [0]-> com.gdata.auth.bean.EmpresaSucursal [“ sucursal”]-> com.gdata.auth.bean.Sucursal [“ empresaSucursal”]-> org.hibernate.collection.internal。 PersistentSet [0]- > com.gdata.auth.bean.EmpresaSucursal [“ sucursal”]-> com.gdata.auth.bean.Sucursal [“ empresaSucursal”]-> org.hibernate.collection.internal.PersistentSet [0]-> com.gdata .auth.bean.EmpresaSucursal [“ sucursal”]-> com.gdata.auth.bean.Sucursal [“ empresaSucursal”]-> org.hibernate.collection.internal.PersistentSet [0]->
  ..........
  
  2017-04-17 10:05:10.447警告9788 --- [nio-8080-exec-1]
  .w.s.m.s.DefaultHandlerExceptionResolver:处理
  [org.springframework.http.converter.HttpMessageNotWritableException]
  导致异常

最佳答案

这些用于解决无限递归(StackOverflowError Ex)

您可以使用@JsonIgnore中断循环。

要么 :


  @JsonManagedReference是引用的前一部分-可以正常序列化的部分。 @JsonBackReference是参考的后半部分–序列化将省略它。


请检查考试:

@Entity
@Table(name = "empresa_sucursal")
public class EmpresaSucursal implements Serializable {

/.../

@JsonBackReference
@Id
@ManyToOne
@JoinColumn(name = "idsucursal" ,referencedColumnName="idsucursal")
private Sucursal sucursal;


@Entity
@Table(name = "empresa")
public class Empresa implements Serializable {

/.../

@JsonManagedReference
@OneToMany(mappedBy="empresa")
private List<EmpresaSucursal> empresaSucursal;
}

10-08 01:33