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

Java Discussion :

une foreign key qui renvoie vers la clé primaire de la meme table


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 90
    Par défaut une foreign key qui renvoie vers la clé primaire de la meme table
    Bonjour,

    j'ai une table dans la base de données qui a un attribut foreign key qui renvoie vers la clé primaire de cette même table.
    Dans la base de données, ça se fait normalement.
    Mais en java, ceci induit que l'attribut en question est de type le nom de la classe.
    Cela me pose un problème dans la compilation. comment le résoudre ?!

  2. #2
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Hello,

    je ne vois pas en quoi cela pose un problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Foo {
        private int field1;
        private int field2;
     
        private Foo field3;
    }
    ça compile très bien...

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par ROUGE87 Voir le message
    Mais en java, ceci induit que l'attribut en question est de type le nom de la classe.
    Cela me pose un problème dans la compilation. comment le résoudre ?!
    Quel problème, quel message d'erreur avez vous, quel code avez vous?

  4. #4
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 90
    Par défaut
    Citation Envoyé par Pill_S Voir le message
    Hello,

    je ne vois pas en quoi cela pose un problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Foo {
        private int field1;
        private int field2;
     
        private Foo field3;
    }
    ça compile très bien...
    j'utilise plutot ce type de décralation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Foo {
        private int field1;
        private int field2;
     
        private Foo field3 = new Foo();
    }
    ceci parce que la déclaration comme tu me l'as dit me génère une autre erreur.


    Citation Envoyé par tchize_ Voir le message
    Quel problème, quel message d'erreur avez vous, quel code avez vous?
    ci joiint la table qui contient les forign key comme je l'ai présenté dans le premier message. l'erreur générée est la suivante :

    Exception in thread "main" java.lang.StackOverflowError

    avec un grand nombre de ligne de la forme :
    at port_type_daogen.Board.<init>(Board.java:49)
    at port_type_daogen.Board.<init>(Board.java:50)


    NB: port_type_daogen est le nom de mon project et Board est le nom de ma classe.
    voici ma déclaration comment je la fais :
    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
     
    public class Board implements Cloneable, Serializable {
     
        /**
         * Persistent Instance variables. This data is directly
         * mapped to the columns of database table.
         */
        private int ID_Board;
        private int ID_MASG_CSG;
        private int ValidSlot;
        private int SlotCount;
        private Board_ref Board_Ref  = new Board_ref ();
        private Board Board_process = new Board();
        private Board Board_MotherBoard = new Board();
        private String Board_Name;
        private String Board_Label;
        private Eng_rule_board_name Board_name_rule = new Eng_rule_board_name();
    les lignes 49 et 50 correspondent aux lignes :
    private Board_ref Board_Ref = new Board_ref ();
    private Board Board_process = new Board();
    Images attachées Images attachées  

  5. #5
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    non non pas cool ça.... regarde:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    class Board {
        private Board Board_process = new Board();
    }
    impossible que ça fonctionne ça, c'est normal de se prendre une stackoverflow: ce que ça implique, c'est qu'on ne peut pas créer une instance de Board sans créer une autre instance de Board. A chaque fois que tu appelle "new Board", lors de l'initialisation de l'objet, on exécute "private Board Board_process = new Board();", qui lui-même va exécuter "private Board Board_process = new Board();", qui lui-même va exécuter "private Board Board_process = new Board();" etc sans aucun moyen de casser cette logique.... la machine aime jamais trop les pseudo-boucles infinies....

    c'est pourquoi tu ne peux pas initialiser cette variable lors de la déclaration. Par contre, on peut différer cette assignation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Board {
        public Board b = null; // public uniquement pour simplifier l'exemple, sera private dans la vraie vie
    }
     
    Board b1 = new Board();
    Board b2 = new Board();
     
    b1.b = b2; // tadaaam ça marche!

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Foo {
        private int field1;
        private int field2;
     
        private Foo field3 = new Foo();
    }
    Avec un telle déclaration, vous créez des classes à l'infini, ce qui aboutit à une récursion infinie.

    En effet, vous construisez un Foo, qui a un champ privé field3 qu'il initialise en créant un Foo, qui a un champ privé field 3 qui est initialisé en créant un Foo qui .... vous avez compris.

  7. #7
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    ... par contre, une alternative pourrait être:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class Board { 
      private Board b; 
     
      // default constructor
      Board() {} 
     
      // constructor with the field as parameter
      Board(Board b){ this. b = b;}
    }

  8. #8
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 90
    Par défaut
    Citation Envoyé par Pill_S Voir le message
    c'est pourquoi tu ne peux pas initialiser cette variable lors de la déclaration. Par contre, on peut différer cette assignation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Board {
        public Board b = null; // public uniquement pour simplifier l'exemple, sera private dans la vraie vie
    }
     
    Board b1 = new Board();
    Board b2 = new Board();
     
    b1.b = b2; // tadaaam ça marche!
    oui, ca semble bien parfait mais dans le cas où j'utilise le pattern DAO pour fouiller dans la base de données, donc je dois créer les classes métiers et les classes DAO. donc je dois séparer entre les deux. je mettrai à la fin de cette réponse mes deux classes Board et BoardDAO.

    Citation Envoyé par tchize_ Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Foo {
        private int field1;
        private int field2;
     
        private Foo field3 = new Foo();
    }
    Avec un telle déclaration, vous créez des classes à l'infini, ce qui aboutit à une récursion infinie.

    En effet, vous construisez un Foo, qui a un champ privé field3 qu'il initialise en créant un Foo, qui a un champ privé field 3 qui est initialisé en créant un Foo qui .... vous avez compris.
    Merci bien, je vois très bien.

    Citation Envoyé par Pill_S Voir le message
    ... par contre, une alternative pourrait être:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class Board { 
      private Board b; 
     
      // default constructor
      Board() {} 
     
      // constructor with the field as parameter
      Board(Board b){ this. b = b;}
    }
    c'est une très bonne idée et ca aurait été sans problème s'il y avait un seul attribut foreign key de type Board!
    seulement, comme j'ai deux attributs locaux qui sont des foreign key pour Board, ceci pose un problème, je pense.


    Ci-joint deux pieces jointes:
    - le schéma relationnel de la base (une partie de la base).
    - mon code pour le pattern DAO pour mettre en place ce schéma.

    Merci bien
    Images attachées Images attachées  
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. ListView detaillée qui renvoie vers une autre Listview
    Par dandy-kun dans le forum Composants graphiques
    Réponses: 0
    Dernier message: 05/05/2015, 11h34
  2. [2008R2] Comment alimenter une dimension qui contient une Foreign Key
    Par nazimb dans le forum SSIS
    Réponses: 1
    Dernier message: 27/08/2012, 10h56
  3. Foreign key qui pointe sur une autre db
    Par Mardewin dans le forum Requêtes
    Réponses: 1
    Dernier message: 31/03/2011, 14h10
  4. [AJAX] Pop up qui renvoie vers une autre page
    Par gettingway dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/07/2008, 15h06
  5. [PHP-JS] Bouton qui renvoie vers une fonction
    Par francki51 dans le forum Langage
    Réponses: 3
    Dernier message: 28/12/2006, 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