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

JavaFX Discussion :

Combobox - FK qui ne s'update pas


Sujet :

JavaFX

  1. #1
    Candidat au Club
    Femme Profil pro
    En formation java
    Inscrit en
    Mars 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : En formation java

    Informations forums :
    Inscription : Mars 2016
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Combobox - FK qui ne s'update pas
    Bonjour à tous,

    Ça fait un moment que je suis devant ce problème, j'ai beau le tourner dans tous les sens, je ne vois pas la solution :

    Je suis junior en Java et je suis en train d'apprendre javaFX. J'utilise Netbeans, dernière version, avec EclipseLink, java DB, du jpa et SceneBuilder.

    J'ai une classe "Entreprise" qui a un seul moyen de transport, et une classe "Transport" qui concerne plusieurs entreprises.

    La classe Entreprise :

    Code : 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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    private IntegerProperty idEntreprise = new SimpleIntegerProperty();
     
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Basic(optional = false)
        @Column(name = "ID_ENTREPRISE", nullable = false)
        public Integer getIdEntreprise(){
            return idEntreprise.get();
        }
        public void setIdEntreprise(Integer value){
            idEntreprise.set(value);
        }
        public IntegerProperty idEntrepriseProperty(){
            return idEntreprise;
        }
     
    [...]
     
    //ASSOCIATION ENTREPRISE - TRANSPORT
        private  ObjectProperty<Transport> oneTransport = new SimpleObjectProperty();
        @ManyToOne (cascade=CascadeType.PERSIST)
        @JoinColumn(name="ONETRANSPORT_ID_TRANSPORT", referencedColumnName="ID_TRANSPORT")
        public Transport getOneTransport(){
            return oneTransport.get();
        }
        public void setOneTransport(Transport value){
            oneTransport.set(value);
        }
        public ObjectProperty<Transport> oneTransportProperty(){
            return oneTransport;
        }
     
    [...]
     
    @Override
        public void writeExternal(ObjectOutput out) throws IOException {
            [...]
            out.writeObject(getOneTransport());
            [...]
        }
     
    @Override
        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
            [...]
            setOneTransport((Transport)in.readObject());
            [...]
        }
     
    //Les constructeurs [...]
    La classe Transport :
    Code : 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
     
    //Je ne laisse que le passage OneToMany, puisque le principe, pour le reste, est le même que pour Entreprise
     
    private ObservableList<Entreprise> colEntreprise =  FXCollections.observableArrayList();
    //    @Access(AccessType.PROPERTY)
        @OneToMany(mappedBy = "oneTransport",cascade = CascadeType.ALL)
        public List<Entreprise> getColEntreprise(){
            return colEntreprise;
        }
     
        public void setColEntreprise(final List<Entreprise> colEntreprise){
            this.colEntreprise.setAll(colEntreprise);
        }
     
        public ListProperty colEntrepriseProperty(){
            return (ListProperty) colEntreprise;
        }
    Quand j'affiche l'entreprise, tout s'affiche correctement. Le problème arrive quand je veux éditer une entreprise pour y changer le moyen de transport. Voici ce que j'ai dans le controller :


    Code : 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
    35
    36
    37
    38
     
    [...]
    @FXML
        private ComboBox<Transport> transportCBox;
        ObservableList<Transport> transportData = FXCollections.observableArrayList();
     
    @Override
        public void initialize(URL location, ResourceBundle resources) {  
     
           transportCBox.setItems(transportData);
           fillTransport();
        }
     
    @FXML
        void doneBtnClick(ActionEvent event) {
            if (!editMode){
                e = new Entreprise();
            }
     
    [...]
            e.setOneTransport(transportCBox.getValue());
     
            em.getTransaction().begin();
            em.persist(e);
            em.getTransaction().commit();
            em.close();
     
            cancelBtnClick();
        }    
     
    public void fillTransport(){
            em = JobSeeker.emf.createEntityManager();
            List<Transport> lst = em.createQuery("Select t from Transport t").getResultList();
            for (Transport t : lst){
                transportData.add(new Transport(t.getIdTransport(),t.getNomTransport()));
            } 
            em.close();
        }
    Enfin, au cas où, voici le code de la BDD :

    Code : 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
     
    create table "ENTREPRISE"
    (
    "ID_ENTREPRISE" INT not null primary key GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
    "NOM_ENTREPRISE" VARCHAR(50) NOT NULL,
    [...]
    "ONETRANSPORT_ID_TRANSPORT" INT NOT NULL,
     
    [...]
    FOREIGN KEY (ONETRANSPORT_ID_TRANSPORT) REFERENCES TRANSPORT (ID_TRANSPORT)
    )
     
    create table "TRANSPORT"
    (
    "ID_TRANSPORT" INT not null primary key GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
    "NOM_TRANSPORT" VARCHAR(20)
    )
    Le problème rencontré : quand j'édite l'entreprise et que j'y modifie le moyen de transport, donc, d'une part la foreign key n'est pas modifiée, à la place une nouvelle entreprise est créée avec le nouveau transport, et d'autre part, un nouveau nom_transport est ajouté dans la table du même nom.

    Je n'ai pas encore entré de règle d'unicité, je comptais le faire ensuite, de plus, il est possible que ça et là, les règles de nommage ne soient pas respectées mais je n'ai pas l'impression que le problème vient de là. Je ne suis même pas sûre que le souci vienne de la couche javaFX, c'est très probablement plus du côté du jpa que ça coince. S'il manque des informations, n'hésitez pas à me le signaler.

    Si quelqu'un a la solution, je suis bien évidemment preneuse, dans tous les cas merci de m'avoir lue.

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Visiblement si une nouvelle entreprise est créée a lieu qu'une déjà existante soit mise à jour c'est qu'il y a un soucis dans la logique de ton code (et donc effectivement JavaFX n'en est peut-être pas la cause). Donc mieux vaut mettre des breakpoints et voir ce qui se passe au débogueur et essayer de localiser l'endroit où se fait l'instanciation.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Candidat au Club
    Femme Profil pro
    En formation java
    Inscrit en
    Mars 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : En formation java

    Informations forums :
    Inscription : Mars 2016
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci pour ta réponse, je vais essayer de voir ça. Je ne sais pas vraiment utiliser le débogueur, mais c'est l'occasion de l'apprendre. Au pire, je reprendrai tout depuis le début pour cette partie.

  4. #4
    Candidat au Club
    Femme Profil pro
    En formation java
    Inscrit en
    Mars 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : En formation java

    Informations forums :
    Inscription : Mars 2016
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    J'ai finalement tout repris depuis le début, et changer pas mal de choses dès les .fxml. J'ai résolu le premier souci, le problème venait de ces lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    em.getTransaction().begin();
    em.persist(e);
    em.getTransaction().commit();
    Dans la méthode "doneBtnClick" de mon premier post. Cette méthode permettait non seulement d'ajouter un nouveau transport, mais aussi de l'éditer, le boolean permettait de reconnaitre l'un ou l'autre cas de figure. En faisant deux méthodes distinctes ça passe mieux, j'ai fait ainsi pour l'update :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    em.getTransaction().begin();
    em.merge(e);
    em.getTransaction().commit();
    Je n'ai pas l'explication exacte du pourquoi là ça fonctionne et pas avant, je pensais que le persist permettait les deux.

    Je reviendrai pour le second souci, en espérant pouvoir mettre en résolu.

Discussions similaires

  1. JProgressBar qui ne s'update pas dans un thread
    Par ionone dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 31/07/2012, 17h14
  2. [Ajax] Updatepanel qui s'update pas.
    Par ketthos dans le forum ASP.NET
    Réponses: 5
    Dernier message: 18/02/2008, 14h48
  3. [SQL] Requête UPDATE qui ne s'exécute pas avec PHP
    Par xplose dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 16/08/2007, 09h42
  4. Combobox.text qui ne se met pas à jour
    Par davels dans le forum Delphi
    Réponses: 6
    Dernier message: 21/08/2006, 10h29
  5. [VB.NET] Update qui ne se réalise pas
    Par totoche dans le forum ASP.NET
    Réponses: 4
    Dernier message: 20/05/2005, 11h16

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