2017-04-12 56 views
1

我調試了代碼,變量「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 ) –

回答

1

這些都是用來解決無限遞歸(防爆的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

0

您必須隔離兩個不同的模型。你有數據庫模型(實體)和前端模型(沒有實體)。

您必須將實體轉換爲前端模型。

例如:

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

(只是一個例子,它不工作,它不是編譯但只有結構例)

1

您是否使用JPA或者Hibernate?在休眠期間,同一類中允許有多個@id。但它不符合JPA標準。但實際上你不需要在EmpresaSucursal類的每個參考中使用@id。如果您確實需要ID字段,請使用單獨的ID字段,如「

@Id 
@GeneratedValue 
private int id; 

。您可以使用@UniqueConstraint(columnNames = {"", ""})定義組合鍵。

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