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 :

Foreign key dans une TableView


Sujet :

JavaFX

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Etudiant en BTS
    Inscrit en
    mai 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant en BTS
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2019
    Messages : 9
    Points : 1
    Points
    1
    Par défaut Foreign key dans une TableView
    Bonjour,
    Voici mon problème :

    J'ai une table "Location" qui contient le "Proprietaire" et le "Locataire" qui eux sont des clés étrangères qui font appel aux table Proprietaire et Locataire ( via les ID logique ).
    J'aimerais afficher dans une TableView ( deux colonnes ) le nom du Propriétaire et du Locataire, sauf que je ne trouves pas comment faire :/

    Voici mon objet Location :
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    package fr.signoret.epreuve4.model;
    
    public class Location {
    
    	int id_Location;
    	int id_Proprietaire;
    	int id_Locataire;
    	float loyer;
    	float charges;
    	String adresse;
    	String adresseSuite;
    	int codePostal;
    	String ville;
    	int type;
    	int nbrPiece;
    	int nbrSalleBain;
    	int nbrWC;
    	String cave;
    	String garage;
    	String parking;
    	String balcon;
    	float superficieBalcon;
    	public Location(int id_Location, int id_Proprietaire, int id_Locataire, float loyer, float charges, String adresse,
    			String adresseSuite, int codePostal, String ville, int type, int nbrPiece, int nbrSalleBain, int nbrWC,
    			String cave, String garage, String parking, String balcon, float superficieBalcon) {
    		super();
    		this.id_Location = id_Location;
    		this.id_Proprietaire = id_Proprietaire;
    		this.id_Locataire = id_Locataire;
    		this.loyer = loyer;
    		this.charges = charges;
    		this.adresse = adresse;
    		this.adresseSuite = adresseSuite;
    		this.codePostal = codePostal;
    		this.ville = ville;
    		this.type = type;
    		this.nbrPiece = nbrPiece;
    		this.nbrSalleBain = nbrSalleBain;
    		this.nbrWC = nbrWC;
    		this.cave = cave;
    		this.garage = garage;
    		this.parking = parking;
    		this.balcon = balcon;
    		this.superficieBalcon = superficieBalcon;
    	}
    	public int getId_Location() {
    		return id_Location;
    	}
    	public int getId_Proprietaire() {
    		return id_Proprietaire;
    	}
    	public int getId_Locataire() {
    		return id_Locataire;
    	}
    	public float getLoyer() {
    		return loyer;
    	}
    	public float getCharges() {
    		return charges;
    	}
    	public String getAdresse() {
    		return adresse;
    	}
    	public String getAdresseSuite() {
    		return adresseSuite;
    	}
    	public int getCodePostal() {
    		return codePostal;
    	}
    	public String getVille() {
    		return ville;
    	}
    	public int getType() {
    		return type;
    	}
    	public int getNbrPiece() {
    		return nbrPiece;
    	}
    	public int getNbrSalleBain() {
    		return nbrSalleBain;
    	}
    	public int getNbrWC() {
    		return nbrWC;
    	}
    	public String getCave() {
    		return cave;
    	}
    	public String getGarage() {
    		return garage;
    	}
    	public String getParking() {
    		return parking;
    	}
    	public String getBalcon() {
    		return balcon;
    	}
    	public float getSuperficieBalcon() {
    		return superficieBalcon;
    	}
    	public void setId_Location(int id_Location) {
    		this.id_Location = id_Location;
    	}
    	public void setId_Proprietaire(int id_Proprietaire) {
    		this.id_Proprietaire = id_Proprietaire;
    	}
    	public void setId_Locataire(int id_Locataire) {
    		this.id_Locataire = id_Locataire;
    	}
    	public void setLoyer(float loyer) {
    		this.loyer = loyer;
    	}
    	public void setCharges(float charges) {
    		this.charges = charges;
    	}
    	public void setAdresse(String adresse) {
    		this.adresse = adresse;
    	}
    	public void setAdresseSuite(String adresseSuite) {
    		this.adresseSuite = adresseSuite;
    	}
    	public void setCodePostal(int codePostal) {
    		this.codePostal = codePostal;
    	}
    	public void setVille(String ville) {
    		this.ville = ville;
    	}
    	public void setType(int type) {
    		this.type = type;
    	}
    	public void setNbrPiece(int nbrPiece) {
    		this.nbrPiece = nbrPiece;
    	}
    	public void setNbrSalleBain(int nbrSalleBain) {
    		this.nbrSalleBain = nbrSalleBain;
    	}
    	public void setNbrWC(int nbrWC) {
    		this.nbrWC = nbrWC;
    	}
    	public void setCave(String cave) {
    		this.cave = cave;
    	}
    	public void setGarage(String garage) {
    		this.garage = garage;
    	}
    	public void setParking(String parking) {
    		this.parking = parking;
    	}
    	public void setBalcon(String balcon) {
    		this.balcon = balcon;
    	}
    	public void setSuperficieBalcon(float superficieBalcon) {
    		this.superficieBalcon = superficieBalcon;
    	}
    	
    	
    }
    Voici la ou je définis ma TableView et je met des choses dans les colonnes :
    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
     
     
    	@FXML
    	private TableView<Location> tableLocation;
    	@FXML
    	private TableColumn<Location, String> col_proLoc;
    	@FXML
    	private TableColumn<Location, String> col_locLoc;
     
    	// ObservableList Location
    	public static ObservableList<Location> oblistLocation = BddLocation.SelectLocation();
     
     
     
    	@Override
    	public void initialize(URL arg0, ResourceBundle arg1) {
     
    		col_proLoc.setCellValueFactory(new PropertyValueFactory<>("Proprietaire"));
    		col_locLoc.setCellValueFactory(new PropertyValueFactory<>("Locataire"));
     
    		tableLocation.setItems(oblistLocation);
     
    		// La cellule du Proprio séléctionné
     
    		tableLocation.getSelectionModel().selectedItemProperty().addListener(
                    (observable, oldValue, newValue) -> showLocationDetails(newValue));
     
        }
    Puis comment j'appeles dans 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    package fr.signoret.epreuve4.dao;
     
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
     
    import fr.signoret.epreuve4.model.Cste;
    import fr.signoret.epreuve4.model.Locataire;
    import fr.signoret.epreuve4.model.Location;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
     
    public class BddLocation {
     
     
    	public static Connection getConnection() throws SQLException {
    		Connection connection = DriverManager.getConnection(Cste.url, Cste.login, Cste.password);
     
    		return connection;
    	}
     
    	static ObservableList<Location> oblistLocation = FXCollections.observableArrayList();
     
    	public static ObservableList<Location> SelectLocation() {
    		try {
    			Connection con = getConnection();
    			ResultSet result = con.createStatement().executeQuery("Select * FROM Location");
     
    			while(result.next()) {
    				oblistLocation.add(new Location(result.getInt(1), result.getInt(2),result.getInt(3),result.getFloat(4),result.getFloat(5),result.getString(6),result.getString(7),result.getInt(8),result.getString(9),result.getInt(10),result.getInt(11),result.getInt(12),result.getInt(13),result.getString(14),result.getString(15),result.getString(16),result.getString(17),result.getFloat(18)));
    			}
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return oblistLocation;
    	}
     
    }
    Je supposes qu'il doit y avoir quelques choses à faire avec les INNER JOIN ??

    Merci à vous,

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : août 2005
    Messages : 6 243
    Points : 22 361
    Points
    22 361
    Billets dans le blog
    48
    Par défaut
    Hein ? Quoi ? What ? Euh ta TableView n'a aucune connaissance de comment tu récupère tes data, de leur provenance, de si c'est du SQL ou n'importe quoi d'autre. Tout ce qui la concerne c'est ce que tu affiches dedans c'est comment afficher une vu de l'objet dans la colonne X via le CellValueFactort de cette colonne X.

    Ceci étant dit, qu'est ce que tu veux afficher ? Juste id_Locataire et id_Proprietaire ? Ou les valeurs réelles associées dans ta BD ? D'après ta question c'est l'option 2; donc tu vas devoir faire des requêtes annexes, jointures ou autre. Donc ce n'est pas un soucis de JavaFX mais bien un soucis de JDBC donc pour ça à toi de voir de ton coté car c'est indépendant de la couche UI.

    Cependant afficher ça coté UI va demander un peu plus de réflexion et plusieurs choix s'offrent à toi pour essayer d'afficher ça :

    1. Si l'objet Location n'est utilisé qu'ici, tu peux te permettre de rajouter ces deux champs dans Location et comme ça tu pourra faire un affichage direct de ces valeurs. C'est un peu gênant dans le sens ou tu vas devoir charger des données en plus en mémoire mais c'est quand même ce qu'il y a de plus facile à faire le cœur du problème étant uniquement sur la partie JDBC.
    2. Si l'objet Location doit être utilisé ailleurs et qu'il ne doit pas conserver ce genre d'info superflues ; tu peux te créer un second objet local à cette partie de ton UI, par exemple LocationExt, que rempliera via une nouvelle requête et qui servira à afficher ces 2 colonnes. Tu fais ça une fois lorsque cette partie de l'UI est initialisée et ensuite tu réutiliseras ces données pour afficher la table. L'ennui c'est qu'une fois de plus tu va avoir tendance à tout précharger ce qui peut te faire mettre en mémoire pas mal de données supplémentaires.
    3. Si tu veux faire quelque chose de plus dynamique, tu devras aller vérifier si cette info est déjà chargée pour cette ligne de la table et sinon faire la requête appropriée pour charger les valeurs. C'est peut-être pas génial de faire 36.000 requêtes séparées vers la BD donc tu voudras peut-être les regrouper ce qui va t'obliger à faire un système pour les regrouper.


    Dans les cas 2) et 3) ne pas oublier que la vue de la colonne attend une ObjectProperty<String> (qui contiendra initialement la valeur null) et que la table mettra automatiquement son affichage à jour quand on mettra à jour la valeur contenue dedans avec le nom de la personne tel que retourné par la BD.

    Difficile d'être plus clair pour le moment. A toi de voir quelle stratégie t’intéresse et après on pourra voir les détails.

    Et dans tous les cas ne pas oublier qu'il ne faudra pas geler l'UI donc il faut utiliser des taches de fond avec genre Service/Task pour ne pas bloquer ton UI. Ici avec public static ObservableList<Location> oblistLocation = BddLocation.SelectLocation(); (ps ; le nom des méthodes commencent par des minuscules en Java) tu bloques complètement ton UI lors de sa création.
    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
    Nouveau Candidat au Club
    Homme Profil pro
    Etudiant en BTS
    Inscrit en
    mai 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant en BTS
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2019
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    En effet ce que je souhaites afficher c'est les valeurs réel associés à chaque ID.

    J'ai déjà dans Location Id_Proprietaire & Id_Locataire mais ce que j'ai du mal à comprendre et savoir comment faire c'est le fait que ma tableView actuellement connait pour chaque colonne les deux ID ( qui sont des INT ) mais comment retranscrir ses int en valeur réel dans Initialize.

    Si je fais des méthodes annexs avec un "Select Nom,Prenom FROM proprietaire WHERE location.Id_Proprietaire = Id_proprietaire" cela devrait dire que je dois créer une autre observableList pour y afficher dans ma tableview ?

    Quand un utilisateur clique sur une Location je devrais afficher des informations sur la Location à côté, de ce style :
    Nom : 1557650276-screenshot-15.png
Affichages : 35
Taille : 33,5 Ko
    ( toutes les informations affichés viennent de la BDD )

    Avec plusieurs observableList ça risque d'être compliqué après vu que toutes les informations sont dans la première observableList.

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : août 2005
    Messages : 6 243
    Points : 22 361
    Points
    22 361
    Billets dans le blog
    48
    Par défaut
    Pourquoi faire plusieurs listes observables quand tu peux en avoir une seule qui contient à la fois les infos de ta location, de tes locataires et propriétaires ? (solution #1 dans ce que j'ai mentionné).

    La méthode initialize() ça sert à monter l'UI pas à faire joujou avec JDBC. Essaie d'arriver à découpler tes couches UI et data access. Il est plus facile de trouver les solutions à des problèmes complexes quand on isole les parties qui n'ont que peu de rapport entre elles. Comment afficher les infos dans ton UI est un problème différent de comment récupérer ces mêmes infos dans ta BD.
    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

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Etudiant en BTS
    Inscrit en
    mai 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant en BTS
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2019
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Il est possible de stocker différents objets dans une seul observableList ? à quoi sert le parametre que l'on lui met alors " public static ObservableList<Location> " ?

    Ah ! J'ai peux être une solution je n'ai pas encore essayé, dès que mon application se lance je vais déjà récupérer toutes les informations dans trois observableList ( Proprietaire, Locataire, Location ) Id, Nom, Prenom, etc

    Vu que j'ai déjà dans ma mémoire toutes les informations ( bon le moyen utilisé est sûrement bien dégueulasse ) mais comparé chaque Location avec les ID des objets dans l'observableList afin d'y récupérer le nom & prénom ?

    Genre un ObservableListProprietaire.search() truc du genre ?

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : août 2005
    Messages : 6 243
    Points : 22 361
    Points
    22 361
    Billets dans le blog
    48
    Par défaut
    Non mais il est possible de stocker plusieurs objets dans un autre objet...
    Un exemple très simpliste et pas optimisé au niveau gestion mémoire (car on pré-charge tout en avance)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class LocationQueryResult {
     
      private Location location;
      private Proprietaire proprietaire;
      private Locataire locataire;
     
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    List<Location> locations = // Requête JDBC pour récupérer les locations.
    int[] idProprios = locations.stream().
        .mapToInt(location -> location.id_proprietaire)
        .distinct()
        .toArray();
    Map<int, Proprietaire> propriosMap = // Requête JDBC pour récupérer les proprio puis les classer dans une map classée par id.
    int[] idLocataires = locations.stream().
        .mapToInt(location -> location.id_locataire)
        .distinct()
        .toArray();
    Map<int, Locataire> locatairesMap = // Requête JDBC pour récupérer les locataires puis les classer dans une map classée par id.
    return locations.stream()
       .map(location -> new LocationQueryResult (location, propriosMap .get(location.id_proprietaire), locatairesMap.get(location.id_locataire));
       .collect(Collectors.toUnmodifiableList());
    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

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : août 2005
    Messages : 6 243
    Points : 22 361
    Points
    22 361
    Billets dans le blog
    48
    Par défaut
    Pour la Nème fois cette semaine, le mot-clé static n'apporte aucune solution à vos problèmes et ouvre grand la porte à des soucis et divers incompréhensions plus tard dans la maintenance de vos projets (vu que t'es pas le seul à faire cette erreur !!! )
    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

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/03/2018, 16h39
  2. Supprimer une foreign key dans sqlplus
    Par chfakht dans le forum SQL
    Réponses: 1
    Dernier message: 14/04/2014, 22h14
  3. Insertion foreign key dans une form
    Par mamli dans le forum Accès aux données
    Réponses: 2
    Dernier message: 20/04/2012, 22h48
  4. Inclure foreign key dans une primary key?
    Par Timo31 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 25/07/2011, 16h02
  5. Réponses: 4
    Dernier message: 11/03/2011, 17h04

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