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; } }
Advertisement
Answer
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; } }