title: This will cause infinitely deep XML
body: <p>I got this error, can someone help me please?</p>
  
  <blockquote>
    <p>javax.xml.ws.WebServiceException: javax.xml.bind.MarshalException
     - with linked exception: [com.sun.istack.internal.SAXException2: A cycle is detected in the object graph. This will cause infinitely deep
    XML: tn.bh.jpa.Compte@1144c75 -> tn.bh.jpa.Mouvement_Compte@1f4eccd ->
    tn.bh.jpa.Compte@1144c75]     at
    com.sun.xml.internal.ws.message.jaxb.JAXBMessage.writePayloadTo(Unknown
    Source)   at
    com.sun.xml.internal.ws.message.AbstractMessageImpl.writeTo(Unknown
    Source)   at
    com.sun.xml.internal.ws.encoding.StreamSOAPCodec.encode(Unknown
    Source)   at
    com.sun.xml.internal.ws.encoding.SOAPBindingCodec.encode(Unknown
    Source)   at
    com.sun.xml.internal.ws.transport.http.HttpAdapter.encodePacket(Unknown
    Source)   at
    com.sun.xml.internal.ws.transport.http.HttpAdapter.access$100(Unknown
    Source)   at
    com.sun.xml.internal.ws.transport.http.HttpAdapter$HttpToolkit.handle(Unknown
    Source)   at
    com.sun.xml.internal.ws.transport.http.HttpAdapter.handle(Unknown
    Source)   at
    com.sun.xml.internal.ws.transport.http.server.WSHttpHandler.handleExchange(Unknown
    Source)   at
    com.sun.xml.internal.ws.transport.http.server.WSHttpHandler.handle(Unknown
    Source)   at com.sun.net.httpserver.Filter$Chain.doFilter(Unknown
    Source)   at sun.net.httpserver.AuthFilter.doFilter(Unknown Source)   at
    com.sun.net.httpserver.Filter$Chain.doFilter(Unknown Source)  at
    sun.net.httpserver.ServerImpl$Exchange$LinkHandler.handle(Unknown
    Source)   at com.sun.net.httpserver.Filter$Chain.doFilter(Unknown
    Source)   at sun.net.httpserver.ServerImpl$Exchange.run(Unknown Source)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
      at java.lang.Thread.run(Unknown Source) Caused by:
    javax.xml.bind.MarshalException
     - with linked exception: [com.sun.istack.internal.SAXException2: A cycle is detected in the object graph. This will cause infinitely deep
    XML: tn.bh.jpa.Compte@1144c75 -> tn.bh.jpa.Mouvement_Compte@1f4eccd ->
    tn.bh.jpa.Compte@1144c75]     at
    com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(Unknown
    Source)   at
    com.sun.xml.internal.bind.v2.runtime.BridgeImpl.marshal(Unknown
    Source)   at com.sun.xml.internal.bind.api.Bridge.marshal(Unknown
    Source)   ... 19 more Caused by: com.sun.istack.internal.SAXException2:
    A cycle is detected in the object graph. This will cause infinitely
    deep XML: tn.bh.jpa.Compte@1144c75 ->
    tn.bh.jpa.Mouvement_Compte@1f4eccd -> tn.bh.jpa.Compte@1144c75    at
    com.sun.xml.internal.bind.v2.runtime.XMLSerializer.reportError(Unknown
    Source)   at
    com.sun.xml.internal.bind.v2.runtime.XMLSerializer.pushObject(Unknown
    Source)   at
    com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(Unknown
    Source)   at
    com.sun.xml.internal.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(Unknown
    Source)   at
    com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(Unknown
    Source)   at
    com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(Unknown
    Source)   at
    com.sun.xml.internal.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(Unknown
    Source)   at
    com.sun.xml.internal.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(Unknown
    Source)   at
    com.sun.xml.internal.bind.v2.runtime.property.ArrayERProperty.serializeBody(Unknown
    Source)   at
    com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(Unknown
    Source)   at
    com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(Unknown
    Source)   at
    com.sun.xml.internal.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(Unknown
    Source)   at
    com.sun.xml.internal.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(Unknown
    Source)   at
    com.sun.xml.internal.bind.v2.runtime.property.ArrayERProperty.serializeBody(Unknown
    Source)   at
    com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(Unknown
    Source)   at
    com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(Unknown
    Source)   ... 22 more</p>
  </blockquote>
  
  <p><strong>tn.bh.jpa.Compte</strong></p>
  
  <pre><code>@Entity
  @Table(name="compte")
  public class Compte {
      @Id
      @Column(name="compte_rib")
      private Integer rib;
  
      @ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE})
      @JoinColumn(name="compte_utilisateurIdentifiant")
      @XmlTransient
      private User user;
  
      @Column(name="compte_libelle")
      private String libelle;
  
      @OneToMany(mappedBy="compte")
      private List&lt;Solde&gt; soldeList;
  
      @Column(name="compte_dateCreation", nullable=false)
      private String dateCréation;
      @Column(name="compte_dateMaj", nullable=false)
      private String dateMaj;
      @Column(name="compte_typeDevise", nullable=false)
      private Integer typeDevise;
      @Column(name="compte_situationCompte", nullable=false)
      private Integer situationCompte;
  
      @OneToMany(fetch = FetchType.EAGER, mappedBy="compte2")
      @XmlTransient
      private List&lt;Mouvement_Compte&gt; mvtList;
  
      @ManyToMany(cascade = {CascadeType.ALL},
              mappedBy = "comptes",
              targetEntity = Virement.class)
      private List&lt;Virement&gt; virementList;
  
      public Compte(){}
  
      public Compte(Integer rib, String libelle, String dateCréation, String dateMaj,
              Integer typeDevise, Integer situationCompte) {
          this.rib = rib;
          this.libelle = libelle;
          this.dateCréation = dateCréation;
          this.dateMaj = dateMaj;
          this.typeDevise = typeDevise;
          this.situationCompte = situationCompte;
      }
  
  
  
      public boolean equals(Compte c){
          boolean returnValue = true;
          if ((!this.rib.equals(c.getRib()))
                  || (!this.dateCréation.equals(c.getDateCréation()))
                  || (!this.dateMaj.equals(c.getDateMaj()))
                  || (!this.typeDevise.equals(c.getTypeDevise()))
                  || (!this.situationCompte.equals(c.getSituationCompte())))
  
              returnValue = false;
  
          return returnValue; 
      }
  
      public String toString(Compte c){
          return "[Rib] : " + c.getRib() + " [Libelle] : " + c.getLibelle() + " [String création] : " + 
                  c.getDateCréation() + " [String mise-à-jour] : " + c.getDateMaj() + " [Type devise] : " + 
                  c.getTypeDevise() + " [Situation compte] : " + c.getSituationCompte();
      }
  
      public Integer getRib() {
          return rib;
      }
  
      public void setRib(Integer rib) {
          this.rib = rib;
      }
  
      public String getLibelle() {
          return libelle;
      }
  
      public void setLibelle(String libelle) {
          this.libelle = libelle;
      }
  
      public String getDateCréation() {
          return dateCréation;
      }
  
      public void setDateCréation(String dateCréation) {
          this.dateCréation = dateCréation;
      }
  
      public String getDateMaj() {
          return dateMaj;
      }
  
      public void setDateMaj(String dateMaj) {
          this.dateMaj = dateMaj;
      }
  
      public Integer getTypeDevise() {
          return typeDevise;
      }
  
      public void setTypeDevise(Integer typeDevise) {
          this.typeDevise = typeDevise;
      }
  
      public Integer getSituationCompte() {
          return situationCompte;
      }
  
      public void setSituationCompte(Integer situationCompte) {
          this.situationCompte = situationCompte;
      }
  
      public List&lt;Solde&gt; getSoldeList() {
          return soldeList;
      }
  
      public void setSoldeList(List&lt;Solde&gt; soldeList) {
          this.soldeList = soldeList;
      }
  
      public User getUser() {
          return user;
      }
  
      public void setUser(User user) {
          this.user = user;
      }
  
      public List&lt;Mouvement_Compte&gt; getMvtList() {
          return mvtList;
      }
  
      public void setMvtList(List&lt;Mouvement_Compte&gt; mvtList) {
          this.mvtList = mvtList;
      }
  
      public List&lt;Virement&gt; getVirementList() {
          return virementList;
      }
  
      public void setVirementList(List&lt;Virement&gt; virementList) {
          this.virementList = virementList;
      }
  
  
  }
  </code></pre>
  
  <p><strong>tn.bh.jpa.Mouvement_compte</strong></p>
  
  <pre><code>@Entity
  @Table(name="mouvement_compte")
  public class Mouvement_Compte {
      @Id
      @GeneratedValue(strategy=GenerationType.AUTO)
      @Column(name="mouvement_compte_id")
      private Integer id;
  
      @ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE})
      @JoinColumn(name="mouvement_compte_compteRib")
      @XmlTransient
      private Compte compte2;
  
      @Column(name="mouvement_compte_cod_op", nullable=false)
      private String cod_op;
      @Column(name="mouvement_compte_dat_mvt", nullable=false)
      private String dat_mvt;
      @Column(name="mouvement_compte_mnt_mvt", nullable=false)
      private Double mnt_mvt;
      @Column(name="mouvement_compte_sens_mvt", nullable=false)
      private char sens_mvt;
      @Column(name="mouvement_compte_dat_journee", nullable=false)
      private String dat_journee;
  
      public Mouvement_Compte(){}
  
      public Mouvement_Compte(String cod_op, String dat_mvt,
              Double mnt_mvt, char sens_mvt, String dat_journee) {
          this.cod_op = cod_op;
          this.dat_mvt = dat_mvt;
          this.mnt_mvt = mnt_mvt;
          this.sens_mvt = sens_mvt;
          this.dat_journee = dat_journee;
      }
  
      public boolean equals(Mouvement_Compte m){
          boolean returnValue = true;
          if ((!this.id.equals(m.getId()))
                  || (!this.cod_op.equals(m.getCod_op()))
                  || (!this.dat_mvt.equals(m.getDat_mvt()))
                  || (!this.mnt_mvt.equals(m.getMnt_mvt()))
                  || ((this.sens_mvt != m.getSens_mvt()))
                  || (!this.dat_journee.equals(m.getDat_journee())))
  
              returnValue = false;
  
          return returnValue; 
      }
  
      public String toString(Mouvement_Compte m){
          return "[Id] : " + m.getCod_op() + " [Code opération] : " + m.getCod_op() +
                  " [Date] : " + m.getDat_mvt() + " [Montant] : " + m.getMnt_mvt() +
                  " [Sens] : " + m.getSens_mvt() + " [String journée] : " + m.getDat_journee();
      }
  
      public Integer getId() {
          return id;
      }
  
      public void setId(Integer id) {
          this.id = id;
      }
  
      public String getCod_op() {
          return cod_op;
      }
  
      public void setCod_op(String cod_op) {
          this.cod_op = cod_op;
      }
  
      public String getDat_mvt() {
          return dat_mvt;
      }
  
      public void setDat_mvt(String dat_mvt) {
          this.dat_mvt = dat_mvt;
      }
  
      public Double getMnt_mvt() {
          return mnt_mvt;
      }
  
      public void setMnt_mvt(Double mnt_mvt) {
          this.mnt_mvt = mnt_mvt;
      }
  
      public char getSens_mvt() {
          return sens_mvt;
      }
  
      public void setSens_mvt(char sens_mvt) {
          this.sens_mvt = sens_mvt;
      }
  
      public String getDat_journee() {
          return dat_journee;
      }
  
      public void setDat_journee(String dat_journee) {
          this.dat_journee = dat_journee;
      }
  
      public Compte getCompte() {
          return compte2;
      }
  
      public void setCompte(Compte compte) {
          this.compte2 = compte;
      }
  
  
  }
  </code></pre>
  
  <p>WebMethod</p>
  
  <pre><code>@WebMethod
      public List&lt;Compte&gt; consulterListeCpt(String id){
              List&lt;Compte&gt; objects = null;
              try {
                      s = HibernateUtils.getSession();
                      Transaction tx = s.beginTransaction();
                      Query query = s.createQuery("from Compte where compte_utilisateuridentifiant = :y");
                      query.setString("y", id);
                      objects = query.list();
                      tx.commit();
              } catch (HibernateException e) {
                      System.out.println(e.getMessage());
              } finally {
                      s.close();
              }
  
              for (Compte c: objects)
                      System.out.println("[rib] = " + c.getRib() + "\t" +
                                      "[title] = " + c.getLibelle() + "\t" +
                                      "[dateC] = " + c.getDateCréation() + "\t");
  
              return objects;
      }
  </code></pre>
  
  <p>Client main class</p>
  
  <pre><code>    public class Client {
      public static void main(String[] args){
          ServiceService service = new ServiceService();
          tn.bh.services.client.Service srvc = service.getServicePort();
          List&lt;Compte&gt; response = srvc.consulterListeCpt("id");   
      }
  </code></pre>