多对多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] 处理导致异常
这些都是用来解决无限递归(防爆的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;
}
感谢它的工作。这是正确的短语来寻找像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;
复制错误消息的文本,并将其添加到问题(的错误信息格式,可以使用块引用样式),以使其更可读和可搜索引擎索引。此外,为了创建一个https://stackoverflow.com/help/mcve减少类的属性 – perissf
[映射与额外的列的多对多关联表]的可能重复(http://stackoverflow.com/questions/5127129/mapping-many-to-many-association-table-with-extra-columns) –
看看[许多附加列](http://stackoverflow.com/a/5127262/5909679 ) –