多对多jpa stackoverflow

问题描述:

我调试了代码,变量“empresasucursal”嵌入了大量相同的信息,导致内存溢出。什么是根据图像的下方多对多jpa stackoverflow

数据库模型涉及的类的正确方法[![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; 
} 

ERROR在控制台

017-04-17 10:05:10.442 WARN 9788 --- [NIO-8080-EXEC-1] .wsmsDefaultHandlerExceptionResolver:无法写入HTTP 消息: org.springframework.http.converter.HttpMessageNotWritableException: 无法写入内容:Infinite r ecursion(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”] - >玉米.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.EmpresaSu cursal [ “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 2017-04-17 10:05:10.447 WARN 9788 --- [NIO-8080-EXEC-1] .wsmsDefaultHandlerExceptionResolver:的 [org.springframework.http.converter.HttpMessageNotWritableException] 处理导致异常

+0

复制错误消息的文本,并将其添加到问题(的错误信息格式,可以使用块引用样式),以使其更可读和可搜索引擎索引。此外,为了创建一个https://stackoverflow.com/help/mcve减少类的属性 – perissf

+0

[映射与额外的列的多对多关联表]的可能重复(http://stackoverflow.com/questions/5127129/mapping-many-to-many-association-table-with-extra-columns) –

+0

看看[许多附加列](http://stackoverflow.com/a/5127262/5909679 ) –

这些都是用来解决无限递归(防爆的StackOverflowError)

您可以使用@JsonIgnore打破这种循环。

OR:

@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; 
} 
+0

感谢它的工作。这是正确的短语来寻找像JSON {这种类型的结果 \t公司:{ \t \t \t “ID”:1 \t \t \t “农布雷”: “EMP 1” \t \t \t sucursales:{ \t \t \t \t \t ID: “1”, \t \t \t \t \t NOMBRE: “SUC 1” \t \t \t} \t \t} } – Isako

您必须隔离两个不同的模型。你有数据库模型(实体)和前端模型(没有实体)。

您必须将实体转换为前端模型。

例如:

Model frontend = new Model(); 
frontend.setNombre(empresa.getNombre()); 
frontend.setTelefonoFijo(empresa.getEmpresaSucursal().getSucursal().getTelefonoFijo()); 
... 
return frontend; 

(只是一个例子,它不工作,它不是编译但只有结构例)

您是否使用JPA或者Hibernate?在休眠期间,同一类中允许有多个@id。但它不符合JPA标准。但实际上你不需要在EmpresaSucursal类的每个参考中使用@id。如果您确实需要ID字段,请使用单独的ID字段,如“

@Id 
@GeneratedValue 
private int id; 

。您可以使用@UniqueConstraint(columnNames = {"", ""})定义组合键。

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