Home > Mobile >  Spring, Jpa : One To Many Error when the list contains values
Spring, Jpa : One To Many Error when the list contains values

Time:06-03

I want to return a Profile Object in JSON containing a list of login details associated with a social network.

Everything works correctly when the "reseaux_sociaux" table is empty. For my status table I get my statuses in JSON format in my Profile object. However, when "reseaux_sociaux" contains values then I get the error below and my Profile object in JSON format is not returned...

(Logs)

https://cloudvyzor.com/logpad/?query&database=sandbox-7fb06b2c06f198a7c0e4ff7c74d659e0

Profil Class

@Entity
@Table(name = "Profil")
public class Profil {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long Id;

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "IdComptes", nullable = false)
    private Comptes IdComptes;
    private String Avatar;
    private String Banniere;
    private String Pseudo;
    private String MailPro;
    private String Bio;

    @ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    @JoinTable(name = "Statut_Profil", joinColumns = @JoinColumn(referencedColumnName = "Id"),inverseJoinColumns = @JoinColumn(referencedColumnName ="Id"))
    private List<Statut> Statut;

    @OneToMany( mappedBy = "IdProfil")
    @JsonManagedReference("id_profil")
    private List<ReseauxSociaux> Reseaux;

    public Profil(){}

    public Profil(Long id, Comptes idComptes, String avatar, String banniere, String pseudo, String mailPro, String bio) {
        Id = id;
        IdComptes = idComptes;
        Avatar = avatar;
        Banniere = banniere;
        Pseudo = pseudo;
        MailPro = mailPro;
        Bio = bio;
    }
}

ReseauxSociaux Class

@Entity
@IdClass(ReseauxId.class)
public class ReseauxSociaux {
    @Id
    private int Id;
    @Id
    private Long IdProfil;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "IdProfil", insertable = false, updatable = false)
    @JsonBackReference("id_profil")
    private Profil Profil;


    @ManyToOne
    @JoinColumn(name = "Id", insertable = false, updatable = false)
    @JsonBackReference("id")
    private Reseau Reseau;

    private String Identifiant;


    private ReseauxSociaux()
    {}

    public ReseauxSociaux(int id, Long idProfil, String identifiant) {
        Id = id;
        IdProfil = idProfil;

        Identifiant = identifiant;
    }
}

Reseau class

@Entity
public class Reseau {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int Id;
    private String Nom;
    private String Couleur;

    //I tried it with and without and it made no difference
    @OneToMany( mappedBy = "Id")
    @JsonManagedReference("id")
    private List<ReseauxSociaux> Reseaux;

    public Reseau(){}

    public Reseau(int id, String nom, String couleur) {
        Id = id;
        Nom = nom;
        Couleur = couleur;
    }
//Get Set
}

Profil Controller

@RestController
@RequestMapping("/profil")
public class ProfilController {

    private final ProfilRepository profilRepository;

    public ProfilController(ProfilRepository profilRepository) {
        this.profilRepository = profilRepository;
    }

    @PostMapping("/getprofil/{idCompte}")
    Profil GetProfil(@PathVariable("idCompte") Long idCompte)
    {
        Profil profil= profilRepository.findProfilById(idCompte);
        return profil;
    }
}

CodePudding user response:

I finally succeeded... The cause of the problem remains unclear but I have two hypotheses: the first is the use of capital letters on variable names; the second is the use of a list with the onetomany with the same name in two entities.

Profil class

@Entity
@Table(name = "Profil")
public class Profil {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "idComptes", nullable = false)
    @JsonBackReference("id_comptes")
    private Comptes idComptes;
    private String avatar;
    private String banniere;
    private String pseudo;
    private String mailPro;
    private String bio;

    @ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    @JoinTable(name = "statut_profil", joinColumns = @JoinColumn(referencedColumnName = "id"),inverseJoinColumns = @JoinColumn(referencedColumnName ="id"))
    private List<Statut> statut;

    @OneToMany( mappedBy = "idProfil")
    @JsonManagedReference("id_profil")
    private List<ReseauxSociaux> lstprofil;

    public Profil(){}

    public Profil(Long id, Comptes idComptes, String avatar, String banniere, String pseudo, String mailPro, String bio) {
        this.id = id;
        this.idComptes = idComptes;
        this.avatar = avatar;
        this.banniere = banniere;
        this.pseudo = pseudo;
        this.mailPro = mailPro;
        this.bio = bio;
    }
//get set
}

ReseauxSociaux class

    @Entity
    @IdClass(ReseauxId.class)
    public class ReseauxSociaux {
        @Id
        private int id;
        @ManyToOne
        @JoinColumn(name = "id", insertable = false, updatable = false)
        @JsonBackReference("id_reseau")
        private Reseau reseau;
    
        @Id
        private Long idProfil;
    
        @ManyToOne
        @JoinColumn(name = "idProfil", insertable = false, updatable = false)
        @JsonBackReference("id_profil")
        private Profil profil;
    
    
        private String identifiant;
    
    
        private ReseauxSociaux()
        {}
    
    
        public ReseauxSociaux(int id, Reseau reseau, Long idProfil, String identifiant) {
            this.id = id;
            this.reseau = reseau;
            this.idProfil = idProfil;
            this.identifiant = identifiant;
        }
}

Reseau class

@Entity
public class Reseau {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String nom;
    private String couleur;

    @OneToMany( mappedBy = "id")
    @JsonManagedReference("id_reseau")
    private List<ReseauxSociaux> lstreseau;

    public Reseau(){}

    public Reseau(int id, String nom, String couleur) {
        this.id = id;
        this.nom = nom;
        this.couleur = couleur;
    }
}
  • Related