Spring boot 3: relation many to many non sauvée en DB

Spring boot 3: relation many to many non sauvée en DB - Java - Programmation

Marsh Posté le 22-09-2024 à 17:32:12    

Bonjour,
 
j'ai un bug mystique avec une relation many to many avec Spring Boot 3
 
contexte:
 
j'ai 2 entités: une entité QuizzEntity liée à TestEntity par une relation plusieurs à plusieurs donc via une table intermédiaire
 

Code :
  1. @Setter
  2.     @Getter
  3.     @ManyToMany(fetch = FetchType.EAGER,
  4.                 cascade = { CascadeType.PERSIST,
  5.                             CascadeType.MERGE}
  6.     )
  7.     @JoinTable(name = "quiz_test", joinColumns = @JoinColumn(name = "id_quiz" ), inverseJoinColumns = @JoinColumn(name = "id_test" ))
  8.     @JsonBackReference
  9.     Set<TestEntity> tests = new HashSet<>();


 
 

Code :
  1. @Setter
  2.     @ManyToMany(fetch = FetchType.EAGER,
  3.                 cascade = { CascadeType.PERSIST,
  4.                             CascadeType.MERGE,
  5.                             }
  6.     )
  7.     @JoinTable(name = "quiz_test",
  8.                 joinColumns = @JoinColumn(name = "id_test" ),
  9.                 inverseJoinColumns = @JoinColumn(name = "id_quiz" )
  10.     )
  11.     @JsonManagedReference
  12.     @JsonInclude(JsonInclude.Include.NON_NULL)
  13.     Set<QuizzEntity> quizzes = new HashSet<>();


 
 
le service TestService
 

Code :
  1. @Transactional
  2.     public void addExistingQuiz(String testId, String quizzId) {
  3.         // Find TestEntity and QuizzEntity
  4.         TestEntity test = testRepository.findById(Integer.parseInt(testId))
  5.                 .orElseThrow(() -> new EntityNotFoundException("Test with id " + testId + " not found" ));
  6.         QuizzEntity quiz = quizzRepository.findById(Integer.parseInt(quizzId))
  7.                 .orElseThrow(() -> new EntityNotFoundException("Quiz with id " + quizzId + " not found" ));
  8.         // Check if the quiz is already associated with the test
  9.             test.addQuizz(quiz);
  10.             quiz.addTest(test);
  11.             testRepository.saveAndFlush(test);
  12.             quizzRepository.saveAndFlush(quiz);// save to update the relationship
  13.     }


 
Voici le schéma DB:
 

Code :
  1. CREATE TABLE public.quiz_test (
  2.     id INT primary key GENERATED ALWAYS AS IDENTITY,
  3.    id_quiz int NOT NULL,
  4.    id_test int NOT NULL,
  5.     CONSTRAINT fk_quiz_test2_quizz FOREIGN KEY(id_quiz) REFERENCES public.quizz(id),
  6.     CONSTRAINT fk_quiz_test2_test FOREIGN KEY(id_test) REFERENCES public.test(id)
  7. );


 
Quand je fais le test d'ajout avec un client http, tout semble ok, et le get me renvoie bien le test avec le quizz lié.
 
Par contre la table quiz_test reste désespéremment vide (même après redémarrage du pc)
 
Je pige pas  
 
Merci pour votre aide
 
Thomas

Reply

Marsh Posté le 22-09-2024 à 17:32:12   

Reply

Marsh Posté le 23-09-2024 à 13:10:00    

UPDATE:
 
en fait il faut préciser le schéma dans @JoinTable
ex:
@JoinTable(name = "quiz_test",
            schema = "public",
            joinColumns = @JoinColumn(name = "id_test", referencedColumnName = "id" ),
            inverseJoinColumns = @JoinColumn(name = "id_quiz", referencedColumnName = "id" ))


---------------
collectionneur de pâtes thermiques
Reply

Marsh Posté le 23-09-2025 à 14:29:38    

c'est lié au fait que tu as hardcodé le schéma dans ton SQL de création de table.
 
Normalement, ça se fait pas comme ça. Ton schéma est spécifié dans l'url de ta data source.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed