我在API
上使用Spring Boot
作为数据库和mysql
表示法(下面的代码)运行@datarest
来生成Dao's
:
我有一个结构(estructura),它有多个步骤(pasos)和一个expediente(存档或文件),它有一个estructura关联,必须满足多个pasos。
@Entity
@Table(name="expedientexpaso")
public class ExpedientePaso implements Serializable{
private static final long serialVersionUID = 1L;
@EmbeddedId
private ExpedientePasoPK id;
@RestResource(exported=false)
@ManyToOne(fetch = FetchType.EAGER, targetEntity = Expediente.class,optional=true, cascade=CascadeType.MERGE)
@JoinColumns(value = {
@JoinColumn(name = "expediente", referencedColumnName = "id", insertable = false, updatable = false, nullable = false)})
private Expediente expediente;
@RestResource(exported=false)
@ManyToOne(fetch = FetchType.EAGER, targetEntity = Paso.class,optional=true, cascade=CascadeType.MERGE)
@JoinColumns(value = {
@JoinColumn(name = "paso", referencedColumnName = "id", insertable = false, updatable = false, nullable = false)})
private Paso paso;
@Column(name="completo")
private Boolean completo;
@Column(name="fecha_completa")
private Date fechaCompleta;
@JsonIgnore
@Column(name = "fecha_carga")
private Date fechaCarga;
@JsonIgnore
@Column(name = "fecha_mod")
private Date fechaMod;
@JsonIgnore
@RestResource(exported=false)
@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumn(name = "usuario_carga", referencedColumnName = "id")
private Usuario usuarioCarga;
@JsonIgnore
@RestResource(exported=false)
@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumn(name = "usuario_mod", referencedColumnName = "id")
private Usuario usuarioMod;
public ExpedientePasoPK getId() {
return id;
}
public void setId(ExpedientePasoPK id) {
this.id = id;
}
public Expediente getExpediente() {
return expediente;
}
public void setExpediente(Expediente expediente) {
this.expediente = expediente;
}
public Paso getPaso() {
return paso;
}
public void setPaso(Paso paso) {
this.paso = paso;
}
public Boolean getCompleto() {
return completo;
}
public void setCompleto(Boolean completo) {
this.completo = completo;
}
public Date getFechaCompleta() {
return fechaCompleta;
}
public void setFechaCompleta(Date fechaCompleta) {
this.fechaCompleta = fechaCompleta;
}
public Date getFechaCarga() {
return fechaCarga;
}
public void setFechaCarga(Date fechaCarga) {
this.fechaCarga = fechaCarga;
}
public Date getFechaMod() {
return fechaMod;
}
public void setFechaMod(Date fechaMod) {
this.fechaMod = fechaMod;
}
public Usuario getUsuarioCarga() {
return usuarioCarga;
}
public void setUsuarioCarga(Usuario usuarioCarga) {
this.usuarioCarga = usuarioCarga;
}
public Usuario getUsuarioMod() {
return usuarioMod;
}
public void setUsuarioMod(Usuario usuarioMod) {
this.usuarioMod = usuarioMod;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((completo == null) ? 0 : completo.hashCode());
result = prime * result + ((fechaCompleta == null) ? 0 : fechaCompleta.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ExpedientePaso other = (ExpedientePaso) obj;
if (completo == null) {
if (other.completo != null)
return false;
} else if (!completo.equals(other.completo))
return false;
if (fechaCompleta == null) {
if (other.fechaCompleta != null)
return false;
} else if (!fechaCompleta.equals(other.fechaCompleta))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
}
Theres是给我错误的类,这里是链接的类,首先是expediente类
@Entity
@Table(name = "expediente")
public class Expediente implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@JsonIgnore
@JsonBackReference
@GeneratedValue
@Column(name = "id")
private Long id;
@Column(name = "numero_expediente")
private String numeroExpediente;
@RestResource(exported=false)
@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumn(name = "beneficiario", referencedColumnName = "id")
private Beneficiario beneficiario;
@RestResource(exported=false)
@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumn(name = "estructura", referencedColumnName = "id")
private Estructura estructura;
@RestResource(exported=false)
@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumn(name = "franquicia", referencedColumnName = "id")
private Franquicia franquicia;
@RestResource(exported=false)
@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumn(name = "solicitud", referencedColumnName = "id")
private Solicitud solicitud;
@RestResource(exported=false)
@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumn(name = "disposicion", referencedColumnName = "id")
private Disposicion disposicion;
@Column(name = "fecha_carga")
private Date fechaCarga;
@Column(name = "fecha_mod")
private Date fechaMod;
@RestResource(exported=false)
@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumn(name = "usuario_carga", referencedColumnName = "id")
private Usuario usuarioCarga;
@RestResource(exported=false)
@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumn(name = "usuario_mod", referencedColumnName = "id")
private Usuario usuarioMod;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "expediente",cascade=CascadeType.ALL)
@RestResource(exported=false)
private Set<ExpedientePaso> expedientePasos = new HashSet<ExpedientePaso>();
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Beneficiario getBeneficiario() {
return beneficiario;
}
public String getNumeroExpediente() {
return numeroExpediente;
}
public void setNumeroExpediente(String numeroExpediente) {
this.numeroExpediente = numeroExpediente;
}
public void setBeneficiario(Beneficiario beneficiario) {
this.beneficiario = beneficiario;
}
public Estructura getEstructura() {
return estructura;
}
public void setEstructura(Estructura estructura) {
this.estructura = estructura;
}
public Franquicia getFranquicia() {
return franquicia;
}
public void setFranquicia(Franquicia franquicia) {
this.franquicia = franquicia;
}
public Solicitud getSolicitud() {
return solicitud;
}
public void setSolicitud(Solicitud solicitud) {
this.solicitud = solicitud;
}
public Date getFechaCarga() {
return fechaCarga;
}
public void setFechaCarga(Date fechaCarga) {
this.fechaCarga = fechaCarga;
}
public Date getFechaMod() {
return fechaMod;
}
public void setFechaMod(Date fechaMod) {
this.fechaMod = fechaMod;
}
public Usuario getUsuarioCarga() {
return usuarioCarga;
}
public void setUsuarioCarga(Usuario usuarioCarga) {
this.usuarioCarga = usuarioCarga;
}
public Usuario getUsuarioMod() {
return usuarioMod;
}
public void setUsuarioMod(Usuario usuarioMod) {
this.usuarioMod = usuarioMod;
}
public Disposicion getDisposicion() {
return disposicion;
}
public void setDisposicion(Disposicion disposicion) {
this.disposicion = disposicion;
}
public Set<ExpedientePaso> getExpedientePasos() {
return expedientePasos;
}
public void setExpedientePasos(Set<ExpedientePaso> expedientePasos) {
this.expedientePasos = expedientePasos;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((numeroExpediente == null) ? 0 : numeroExpediente.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Expediente other = (Expediente) obj;
if (numeroExpediente == null) {
if (other.numeroExpediente != null)
return false;
} else if (!numeroExpediente.equals(other.numeroExpediente))
return false;
return true;
}
}
这是paso课程:
@Entity
@Table(name = "paso")
public class Paso implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@JsonIgnore
@JsonBackReference
@GeneratedValue
@Column(name = "id")
private Long id;
@Column(name = "paso")
private Integer paso;
@JsonBackReference
@RestResource(exported=true)
@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumn(name = "estructura", referencedColumnName = "id")
private Estructura estructura;
@RestResource(exported=false)
@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumn(name = "tarea", referencedColumnName = "id")
private Tarea tarea;
/*
@RestResource(exported=false)
@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumn(name = "documentacion", referencedColumnName = "id")
private Documentacion documentacion;
@RestResource(exported=false)
@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumn(name = "seguimiento", referencedColumnName = "id")
private Seguimiento seguimiento;
*/
@JsonIgnore
@RestResource(exported=false)
@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumn(name = "vigencia", referencedColumnName = "id")
private Vigencia vigencia;
@JsonIgnore
@Column(name = "fecha_carga")
private Date fechaCarga;
@JsonIgnore
@Column(name = "fecha_mod")
private Date fechaMod;
@JsonIgnore
@RestResource(exported=false)
@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumn(name = "usuario_carga", referencedColumnName = "id")
private Usuario usuarioCarga;
@JsonIgnore
@RestResource(exported=false)
@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumn(name = "usuario_mod", referencedColumnName = "id")
private Usuario usuarioMod;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Integer getPaso() {
return paso;
}
public void setPaso(Integer paso) {
this.paso = paso;
}
public Tarea getTarea() {
return tarea;
}
public void setTarea(Tarea tarea) {
this.tarea = tarea;
}
public Vigencia getVigencia() {
return vigencia;
}
public void setVigencia(Vigencia vigencia) {
this.vigencia = vigencia;
}
public Date getFechaCarga() {
return fechaCarga;
}
public void setFechaCarga(Date fechaCarga) {
this.fechaCarga = fechaCarga;
}
public Date getFechaMod() {
return fechaMod;
}
public void setFechaMod(Date fechaMod) {
this.fechaMod = fechaMod;
}
public Usuario getUsuarioCarga() {
return usuarioCarga;
}
public void setUsuarioCarga(Usuario usuarioCarga) {
this.usuarioCarga = usuarioCarga;
}
public Usuario getUsuarioMod() {
return usuarioMod;
}
public void setUsuarioMod(Usuario usuarioMod) {
this.usuarioMod = usuarioMod;
}
public Estructura getEstructura() {
return estructura;
}
public void setEstructura(Estructura estructura) {
this.estructura = estructura;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((vigencia == null) ? 0 : vigencia.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Paso other = (Paso) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (vigencia == null) {
if (other.vigencia != null)
return false;
} else if (!vigencia.equals(other.vigencia))
return false;
return true;
}
}
最后这里是estructura类:
@Entity
@Table(name = "estructura")
public class Estructura implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@JsonIgnore
@GeneratedValue
@Column(name = "id")
private Long id;
@Column(name = "estructura")
private String estructura;
@Column(name = "fecha_carga")
private Date fechaCarga;
@Column(name = "fecha_mod")
private Date fechaMod;
@JsonManagedReference
@RestResource(exported=false)
@OneToMany(mappedBy = "estructura", fetch = FetchType.EAGER, orphanRemoval = true, cascade = CascadeType.ALL)
private List<Paso> pasos = new ArrayList<Paso>();
@RestResource(exported=false)
@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumn(name = "usuario_carga", referencedColumnName = "id")
private Usuario usuarioCarga;
@RestResource(exported=false)
@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumn(name = "usuario_mod", referencedColumnName = "id")
private Usuario usuarioMod;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getEstructura() {
return estructura;
}
public void setEstructura(String estructura) {
this.estructura = estructura;
}
public Date getFechaCarga() {
return fechaCarga;
}
public void setFechaCarga(Date fechaCarga) {
this.fechaCarga = fechaCarga;
}
public Date getFechaMod() {
return fechaMod;
}
public void setFechaMod(Date fechaMod) {
this.fechaMod = fechaMod;
}
public Usuario getUsuarioCarga() {
return usuarioCarga;
}
public void setUsuarioCarga(Usuario usuarioCarga) {
this.usuarioCarga = usuarioCarga;
}
public Usuario getUsuarioMod() {
return usuarioMod;
}
public void setUsuarioMod(Usuario usuarioMod) {
this.usuarioMod = usuarioMod;
}
public List<Paso> getPasos() {
return pasos;
}
public void setPasos(List<Paso> pasos) {
this.pasos = pasos;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((estructura == null) ? 0 : estructura.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Estructura other = (Estructura) obj;
if (estructura == null) {
if (other.estructura != null)
return false;
} else if (!estructura.equals(other.estructura))
return false;
return true;
}
}
这是错误,我知道这是一个递归,但不知道如何解决它,我对Data Rest
很新,所以任何帮助都会受到赞赏。
错误:
{"timestamp":1466523913292,"status":500,"error":"Internal Server Error","exception":"org.springframework.http.converter.HttpMessageNotWritableException","message":"org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: Infinite recursion (StackOverflowError) (through reference chain: org.springframework.hateoas.PagedResources[\"_embedded\"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: org.springframework.hateoas.PagedResources[\"_embedded\"])","path":"/expedientePaso/"}