IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Boot Java Discussion :

comment enregistrer correctement une donnée qui possède @joincolumn


Sujet :

Spring Boot Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 222
    Par défaut comment enregistrer correctement une donnée qui possède @joincolumn
    Bonjour,

    j'ai une entité matière auquel j'ai appliquer une relation avec une autre entité sommaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class Matiere implements Serializable{
        @Id @GeneratedValue(strategy = GenerationType.IDENTITY) 
        private Long id;
        private String nameMatiere;
        private String route;
        @ManyToOne
        @JoinColumn
        //une matière appartient à un sommaire
        private Sommaire sommaire;
    }
    je tente de faire une requête post pour enregistrer d'une matière , voici ce que j'envoie avec l'outil advance REST

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //l'url http://localhost:8181/matieres
    {"nameMatiere": "devopplus", "route": "devopplus", "sommaire_id":"1"}
    le problème c'est que je n'arrive pas à insérer correctement le champs "sommaire_id".
    la donnée sommaire_id, me donne NULL alors que je devais avoir un 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    | id | name_matiere | route     | sommaire_id |
    +----+--------------+-----------+-------------+
    |  1 | reseaux      | reseaux   |           1 |
    |  2 | linux        | linux     |           1 |
    |  3 | dao          | dao       |           2 |
    |  4 | entities     | entity    |           2 |
    |  5 | NULL         | devopplus |        NULL |
    |  6 | NULL         | devopplus |        NULL |
    |  7 | devopplus    | devopplus |        NULL |
    |  8 | devopplus    | devopplus |        NULL |
    |  9 | devopplus    | devopplus |        NULL |
    | 10 | devopplus    | devopplus |        NULL |
    j'ai testé avec un type 1 sans quote, amis cela me génère aussi un NULL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    {"nameMatiere": "devopplus", "route": "devopplus", "sommaire_id":1}
    voici mon entité sommmaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class Sommaire implements Serializable {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        @Column(unique = true)
        private String nameSommaire;
        private String route;
        @OneToMany(mappedBy="sommaire",fetch = FetchType.EAGER)
        //un sommaire peut avoir plusieur matieres
        private Collection<Matiere> matieres = new ArrayList<>();
     
    }
    comment je dois insérer correctement ma donnée ?

    merci de vos réponses

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    C'est quelle entity que tu persistes ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    salut ,

    moi j´aurais fait comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class Sommaire implements Serializable {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        @Column(unique = true)
        private String nameSommaire;
        private String route;
        @OneToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER)
        @JoinColumn(name = "sommaireid")
        private Collection<Matiere> matieres = new ArrayList<>();
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class Matiere implements Serializable{
        @Id 
        @GeneratedValue(strategy = GenerationType.IDENTITY) 
        private Long id;
        private String nameMatiere;
        private String route;
     
    }
    la tu auras dans la table Matiere ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    | id | name_matiere | route     | sommaire_id |
    +----+--------------+-----------+-------------+
    |  1 | reseaux      | reseaux   |           1 |
    |  2 | linux        | linux     |           1 |
    Bonne journée

    Eric

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 222
    Par défaut
    merci de vos réponse, j'ai testé la solution de cascade mais j'ai une erreur lors de la compilation:
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    @Entity
    @Data @NoArgsConstructor @AllArgsConstructor @ToString
     
    public class Matiere implements Serializable{
        @Id @GeneratedValue(strategy = GenerationType.IDENTITY) 
        private Long id;
        private String nameMatiere;
        private String route;
        //une matiere appartient à un sommaire
        /*
        @ManyToOne
        @JoinColumn(name="sommaire_id")
        private Sommaire sommaire;
        */
    }
     
     
     
    @Entity @Data @NoArgsConstructor @AllArgsConstructor @ToString
     
    public class Sommaire implements Serializable {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        @Column(unique = true)
        private String nameSommaire;
        private String route;
        //un sommaire peut avoir plusieur matieres
        @OneToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER)
        @JoinColumn(name="sommaire_id")
        private Collection<Matiere> matieres = new ArrayList<>();
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    java.lang.Error: Unresolved compilation problems:
            The method save(S) in the type CrudRepository<Matiere,Long> is not applicable for the arguments (Matiere)
            The constructor Matiere(null, String, String, Sommaire) is undefined
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    @Entity @Data @NoArgsConstructor @AllArgsConstructor @ToString
     
    public class Sommaire implements Serializable {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        @Column(unique = true)
        private String nameSommaire;
        private String route;
        //un sommaire peut avoir plusieur matieres
        @OneToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER)
     
        private Collection<Matiere> matieres = new ArrayList<>();
     
    }

    je remet mes 2 entités de mon ide:

    Nom : entite.png
Affichages : 2587
Taille : 45,1 Ko

    par contre je me dit que la donnée est à NULL car spring ne s'attend pas à recevoir directement une clé étrangère par un int puisque c'est un objet de type

    peut être que je suis contraint dans mon dao de mettre une fonction qui enregistre directement le numéro du numéro sommaire ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    @RepositoryRestResource
    public interface MatiereRepository extends JpaRepository<Matiere, Long> {
        public Matiere findByNameMatiere(String nameMatiere);
     
    public insertIdSommaire(id_sommaire){
    ...
    }
    }
    si je test ceci en passant par string main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    		Sommaire s1 =new Sommaire(null, "devops", "devops",null);
    		sommaireRepository.save(s1);
    		matiereRepository.save(new Matiere(null, "reseaux", "reseaux",s1));
     
    		matiereRepository.save(new Matiere(null, "jenkins", "jenkins",1));
    il refusera le id_sommaire = 1 de la nouvelle matière "jenkins".

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    D'après ton code, tu persistes donc Matière, c'est donc matière qui doit avoir l'attribut "cascade".
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 222
    Par défaut
    merci de ta réponse,

    je pense que pour le moment je suis perdu.
    en regardant ce lien j'ai une explication de maitre et esclave d'entité

    http://blog.paumard.org/cours/jpa/ch...-relation.html

    j'ai donc schématiser cela en appliquant à mon problème:

    Nom : manytoone.png
Affichages : 2566
Taille : 14,9 Ko

    est ce que ce que j'ai dessiner et correcte ? car je pense qu'avant de coder correctement mes classes je dois mieux comprendre le oneToMany,
    et mettre le chose dans l'ordre.
    car je pense que je mélange les pinceaux .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 18/08/2016, 17h47
  2. Réponses: 0
    Dernier message: 06/12/2015, 09h14
  3. Réponses: 4
    Dernier message: 16/04/2014, 16h17
  4. Réponses: 1
    Dernier message: 05/06/2012, 15h10
  5. Réponses: 3
    Dernier message: 06/12/2010, 15h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo