很多很多jpa stackoverflow

时间:2017-04-12 21:48:40

标签: java spring hibernate jpa

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

[![empresa_sucursal] [1] [1]

Class 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;
}

Class 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 WARN 9788 --- [nio-8080-exec-1]   .w.s.m.s.DefaultHandlerExceptionResolver:写入HTTP失败   信息:   org.springframework.http.converter.HttpMessageNotWritableException:   无法写内容:无限递归(StackOverflowError)   (通过参考链:   com.gdata.auth.bean.Sucursal [ “empresaSucursal”] - &GT; org.hibernate.collection.internal.PersistentSet [0] - &GT; com.gdata.auth.bean.EmpresaSucursal [ “sucursal”] - &GT;玉米.gdata.auth.bean.Sucursal [ “empresaSucursal”] - &GT; org.hibernate.collection.internal.PersistentSet [0] - &GT; com.gdata.auth.bean.EmpresaSucursal [ “sucursal”] - &GT; COM。 gdata.auth.bean.Sucursal [ “empresaSucursal”] - &GT; org.hibernate.collection.internal.PersistentSet [0] - &GT; com.gdata.auth.bean.EmpresaSucursal [ “sucursal”] - &GT; com.gdata .auth.bean.Sucursal [ “empresaSucursal”] - &GT; org.hibernate.collection.internal.PersistentSet [0] - &GT; com.gdata.auth.bean.EmpresaSucursal [ “sucursal”] - &GT; com.gdata。 auth.bean.Sucursal [ “empresaSucursal”] - &GT; org.hibernate.collection.internal.PersistentSet [0] - &GT; com.gdata.auth.bean.EmpresaSucursal [ “sucursal”] - &GT; com.gdata.auth .bean.Sucursal [ “empresaSucursal”] - &GT; org.hibernate.collection.internal.PersistentSet [0] - &GT; com.gdata.auth.bean.EmpresaSucursal [ “sucursal”] - &GT; com.gdata.auth。 bean.Sucursal [ “empresaSucursal” ] - GT; org.hibernate.collection.internal.PersistentSet [0] - &GT; com.gdata.auth.bean.EmpresaSucursal [ “sucursal”] - &GT; com.gdata.auth.bean.Sucursal [ “empresaSucursal”] - &GT; org.hibernate.collection.internal.PersistentSet [0] - &GT; com.gdata.auth.bean.EmpresaSucursal [ “sucursal”] - &GT; com.gdata.auth.bean.Sucursal [ “empresaSucursal”] - &GT; org.hibernate.collection.internal.PersistentSet [0] - &GT;   ..........

     

2017-04-17 10:05:10.447 WARN 9788 --- [nio-8080-exec-1]   .w.s.m.s.DefaultHandlerExceptionResolver:处理   [org.springframework.http.converter.HttpMessageNotWritableException]   导致异常

4 个答案:

答案 0 :(得分:1)

您使用的是jpa还是Hibernate?在休眠中,同一个类中允许多个@id。但它并不符合JPA标准。但实际上你不必在@id类的每个引用中使用EmpresaSucursal。使用单独的id字段,如“

@Id
@GeneratedValue
private int id;

如果你确实需要一个id字段。

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

答案 1 :(得分:1)

这些用于解决无限递归(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;
}

答案 2 :(得分:0)

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

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

例如:

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

(只是一个例子,它没有工作,它没有编译,只是一个结构性的例子)

答案 3 :(得分:0)

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