Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ';直接自参考导致循环';杰克逊与遗产_Java_Jpa_Inheritance_Jackson_Jaxb - Fatal编程技术网

Java ';直接自参考导致循环';杰克逊与遗产

Java ';直接自参考导致循环';杰克逊与遗产,java,jpa,inheritance,jackson,jaxb,Java,Jpa,Inheritance,Jackson,Jaxb,我有一个类似这样的课程: @Entity @Inheritance(strategy = InheritanceType.JOINED) @Audited @DiscriminatorColumn(name = "tipo_hito") @XmlAccessorType(XmlAccessType.FIELD) @XmlType(propOrder = { "idHito" }) @XmlRootElement(name = "Hito") public abstract class Hito

我有一个类似这样的课程:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Audited
@DiscriminatorColumn(name = "tipo_hito")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = { "idHito" })
@XmlRootElement(name = "Hito")
public abstract class Hito implements Ordenable {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name = "idhito", nullable = false)
    private Long idHito;

    public Long getIdHito() { return idHito; }

    public void setIdHito(Long idHito) { this.idHito = idHito; }
}
以及一个扩展上述类的类

@MappedSuperclass
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = {..., "successors", "predecessors", ...})
@XmlRootElement(name = "HitoOrdenable")
public abstract class HitoOrdenable extends Hito {

    @XmlElement(name = "predecessors")
    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "succession", joinColumns = { @JoinColumn(name = "idpredecessor") }, inverseJoinColumns = { @JoinColumn(name = "idsuccessor") })
    private Set<Hito> predecessors;

    @XmlElement(name = "successors")
    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "succession", joinColumns = { @JoinColumn(name = "idsuccessor") }, inverseJoinColumns = { @JoinColumn(name = "idpredecessor") })
    private Set<Hito> successors;

    // More code...
}
因此,当我得到Hito1时,这有后续的Hito2和Hito3。但是当我得到Hito2时,它有一个前身Hito1。因此,开始一个“无限循环”

确切的错误是:

com.fasterxml.jackson.databind.JsonMappingException:Direct 导致循环的自参考(通过参考链: ar.gob.buenosaires.esb.domain.message.ProyectoRespMsg[“proyectos”]->java.util.ArrayList[5]->ar.gob.buenosaires.domain.Proyecto[“obras”]->org.hibernate.collection.internal.PersistentBag[0]->ar.gob.buenosaires.domain.hitobra[“hitos”]->


我试着在
前辈中设置@JsonIgnore,但没有成功。

经过几天的尝试。我们找到的唯一解决方案是添加
@JsonIgnoreProperties({“preventors”})
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class,property=“idhitoauax”)

HitoOrdenable.java

  @MappedSuperclass
  @XmlType(propOrder = {..., "successors", "predecessors", ...})
  @XmlAccessorType(XmlAccessType.FIELD)
  @JsonIgnoreProperties({ "predecessors" })
  @JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="idHitoAux")
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Audited
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = { "idHito", "tipoHito"})
@JsonIgnoreProperties({"idHitoAux", "hibernateLazyInitializer", "handler"})
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, visible = true, property = "tipoHito")
@JsonSubTypes({
        @JsonSubTypes.Type(name = "hito_obra", value = HitoObra.class),
        @JsonSubTypes.Type(name = "hito_proyecto", value = HitoProyecto.class)
})<
Hito.java

  @MappedSuperclass
  @XmlType(propOrder = {..., "successors", "predecessors", ...})
  @XmlAccessorType(XmlAccessType.FIELD)
  @JsonIgnoreProperties({ "predecessors" })
  @JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="idHitoAux")
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Audited
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = { "idHito", "tipoHito"})
@JsonIgnoreProperties({"idHitoAux", "hibernateLazyInitializer", "handler"})
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, visible = true, property = "tipoHito")
@JsonSubTypes({
        @JsonSubTypes.Type(name = "hito_obra", value = HitoObra.class),
        @JsonSubTypes.Type(name = "hito_proyecto", value = HitoProyecto.class)
})<
@实体
@继承(策略=InheritanceType.JOINED)
@审计
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(proporter={“idHito”,“tipoHito”})
@JsonIgnoreProperties({“idHitoAux”、“hibernateLazyInitializer”、“handler”})
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME,include=JsonTypeInfo.As.EXISTING_属性,visible=true,PROPERTY=“tipoHito”)
@JsonSubTypes({
@JsonSubTypes.Type(name=“hito_obra”,value=HitoObra.class),
@JsonSubTypes.Type(name=“hito_proyecto”,value=HitoProyecto.class)
})<
使用JsonIgnoreProperties,我们可以防止成功者和前辈之间的无限循环,使用
@JsonIdentityInfo
这是因为如果我们使用
“idHito”
而不是
“idHitoAux”
(它等于idHito),Hibernate会将idHito转换为null。因此,使用
“idHitoAux”
Hibernate可以识别列表中的每个对象

PD:在那个解决方案之后,我们遇到了反序列化
抽象类Hito
的问题,所以我们的解决方案是添加
@JsonSubTypes

你好