2017-04-12 9 views
1

私はコードをデバッグし、変数 "empresasucursal"には膨大な量の同じ情報が埋め込まれており、メモリのオーバーフローが発生します。画像Many To Many 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; 

} 

コントローラ方法コンソール

017-04-17 10に

@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:05:10.442は9788に警告--- [NIO-8080-EXEC-1] .wsmsDefaultHandlerExceptionResolver:HTTPの書き込みに失敗しました メッセージ: org.springframework.http.converter.HttpMessageNotWritableException: コンテンツを書き込めませんでした:無限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"] - > 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.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 10:05: [org.springframework.http.converter.HttpMessageNotWritableException] の取り扱いが例外を生じ

:10.447は--- [NIO-8080-EXEC-1] .wsmsDefaultHandlerExceptionResolver 9788 WARN
+0

コピーしたテキストなどのエラーメッセージを、よりそれを作るために(あなたがブロック引用のスタイルを使用することができます書式設定のエラーメッセージのための)質問に追加検索エンジンによって読み取り可能でインデックス可能です。さらに、クラスプロパティを減らしてhttps://stackoverflow.com/help/mcveを作成します – perissf

+0

[多対多関連テーブルを余分な列にマッピングする]の可能な複製(http://stackoverflow.com)/questions/5127129/mapping-many-to-many-associations-table-with-extra-columns) –

+0

[追加の列で多くのものを見る](http://stackoverflow.com/a/5127262/5909679 ) –

答えて

1

これらは無限の再帰(にStackOverflowError例)を解決するために使用されている

あなたは悪循環を断ち切るために@JsonIgnoreを使用することができます。

OR: - 通常連載ます1

@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 Empresaメール:{ \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ノンブル: "SUC 1" \t \t \t} \t \t} } – Isako

0

2つの異なるモデルを分離する必要があります。データベースモデル(エンティティ)とフロントエンドモデル(エンティティなし)があります。

エンティティをフロントエンドモデルに変換する必要があります。例えば

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

(ただ、たとえば、そのは動作していないし、そのコンパイルではないが、唯一の構造例)

1

あなたはJPAを使用するか、または休止していますか?休止状態では、同じクラスで複数の@idが許可されます。しかしJPAには準拠していません。しかし実際にはEmpresaSucursalクラスの各リファレンスで@idを使用する必要はありません。実際にIDフィールドが必要な場合は、「

@Id 
@GeneratedValue 
private int id; 

のように別のIDフィールドを使用してください。

@UniqueConstraint(columnNames = {"", ""})を使用して複合キーを定義することができます。

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