我调试了代码,变量“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] 导致异常
答案 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;