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

Hibernate Java Discussion :

migrer une application qui utilise SQL vers HQL et hibernate


Sujet :

Hibernate Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 10
    Points : 12
    Points
    12
    Par défaut migrer une application qui utilise SQL vers HQL et hibernate
    Bonjour,

    je n'arrive pas à produire l'équivalent HQL de la requête SQL ci-après


    Code SQL : 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
    CREATE TABLE AEROPORT(
      Num_aeroport  INT,
      Nom_aeroport  VARCHAR(40),
     
      PRIMARY KEY(Num_aeroport));
     
     
    CREATE TABLE VOL(
     
      Num_vol  INT,
      Aeroport_dep  INT,
      Aeroport_arr  INT,
     
     
      PRIMARY KEY(Num_vol),
     
      CONSTRAINT fkaeroport FOREIGN KEY (Aeroport_dep) REFERENCES AEROPORT (Num_aeroport),
      CONSTRAINT fkaeroport2 FOREIGN KEY (Aeroport_arr) REFERENCES AEROPORT (Num_aeroport)
     
    );
     
    INSERT INTO AEROPORT (Num_aeroport, Nom_aeroport)  VALUES ('1', 'Angers');
    INSERT INTO AEROPORT (Num_aeroport, Nom_aeroport)  VALUES ('2', 'Rennes');
     
    INSERT INTO VOL (Num_vol, Aeroport_dep, Aeroport_arr)  VALUES ('1', '1', '2');
    INSERT INTO VOL (Num_vol, Aeroport_dep, Aeroport_arr)  VALUES ('2', '2', '1');

    Requete SQL à tranformer en HQL

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select V.num_vol as VOL, A.nom_aeroport as DEPART, A2.nom_aeroport as ARRIVEE from 
    VOL V LEFT JOIN AEROPORT A on V.aeroport_dep=A.num_aeroport LEFT JOIN AEROPORT A2 on V.aeroport_arr=A2.num_aeroport

    +-----+--------+---------+
    | VOL | DEPART | ARRIVEE |
    +-----+--------+---------+
    |   2 | Rennes | Angers  |
    |   1 | Angers | Rennes  |
    +-----+--------+---------+
    voici la classe correspondante à la première la table

    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
     
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.Table;
    import org.hibernate.annotations.GenericGenerator;
     
     
    @Entity
    @Table(name = "AEROPORT")
    public class Aeroport extends EntiteGenerique implements java.io.Serializable {
     
    	private static final long serialVersionUID = 1L;
     
    	private int Num_aeroport;
    	private String Nom_aeroport;
     
    	@Override
    	public String toString() {
    		return  (this.Nom_aeroport);
    	}
     
     
    	public Aeroport() {
    	}
     
    	public Aeroport(int num_aeroport, String nom_aeroport) {
    		this.Num_aeroport = num_aeroport;
    		this.Nom_aeroport = nom_aeroport;
    	}
     
     
    	@Id
    	@GenericGenerator(name="serial" , strategy="increment")
    	@GeneratedValue(generator="serial")
    	@Column(name = "Num_aeroport", unique = true, nullable = false)
     
     
     
    	public int getNum_aeroport() {
    		return this.Num_aeroport;
    	}
     
    	public void setNum_aeroport(int num_aeroport) {
    		this.Num_aeroport = num_aeroport;
    	}
     
    	@Column(name = "Nom_aeroport", length = 255)
    	public String getNom_aeroport() {
    		return this.Nom_aeroport;
    	}
     
    	public void setNom_aeroport(String nom_aeroport) {
    		this.Nom_aeroport = nom_aeroport;
    	}
     
     
     
    	}

    La classe correspondante à la deuxième table


    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
     
     
    package models.entities;
     
     
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.Table;
     
    import org.hibernate.annotations.GenericGenerator;
     
     
    @Entity
    @Table(name = "VOL")
    public class Vol extends EntiteGenerique implements java.io.Serializable {
     
    	private static final long serialVersionUID = 1L;
     
    	private int Num_vol;
    	private int Aeroport_dep;
    	private int Aeroport_arr;
     
     
    	@Override
    	public String toString() {
    		return  ("Num_vol " + Integer.toString(this.Num_vol));
    	}
     
     
    	public Vol() {
    	}
     
    	public Vol(int num_vol, int aeroport_dep, int aeroport_arr) {
    		this.Num_vol = num_vol;
    		this.Aeroport_dep = aeroport_dep;
    		this.Aeroport_arr = aeroport_arr;
    	}
     
     
    	@Id
    	@GenericGenerator(name="serial" , strategy="increment")
    	@GeneratedValue(generator="serial")
    	@Column(name = "num_vol", unique = true, nullable = false)
     
     
     
    	public int getNum_vol() {
    		return this.Num_vol;
    	}
     
    	public void setNum_vol(int num_vol) {
    		this.Num_vol = num_vol;
    	}
     
    	@Column(name = "aeroport_dep", length = 255)
    	public int getAeroport_dep() {
    		return this.Aeroport_dep;
    	}
     
    	public void setAeroport_dep(int aeroport_dep) {
    		this.Aeroport_dep = aeroport_dep;
    	}
     
    	@Column(name = "aeroport_arr", length = 255)
    	public int getAeroport_arr() {
    		return this.Aeroport_arr;
    	}
     
    	public void setAeroport_arr(int aeroport_arr) {
    		this.Aeroport_arr = aeroport_arr;
    	}
     
    	}
    J'ai essayé sans succès de mettre des objets Aeroport dans la class Vol avec des relations OneToOne
    la difficulté que j'ai rencontré c'est que la classe Vol a besoin de 2 objet de la class Aeroport pour implémenter l' aéroport de de départ et l'aéroport d'arrivée

    Pouvez S.V.P m'aider à résoudre ce problème ?

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 462
    Points : 896
    Points
    896
    Billets dans le blog
    5
    Par défaut
    Bon, quelques remarques:
    1) Respecter les conventions Java.
    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
     
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.Table;
    import org.hibernate.annotations.GenericGenerator;
     
     
    @Entity
    @Table(name = "AEROPORT")
    public class Aeroport extends EntiteGenerique implements java.io.Serializable {
     
    	private static final long serialVersionUID = 1L;
     
    	private int numAeroport;
    	private String nomAeroport;
     
    	@Override
    	public String toString() {
    		return  (this.Nom_aeroport);
    	}
     
     
    	public Aeroport() {
    	}
     
    	public Aeroport(int numAeroport, String nomAeroport) {
    		this.numAeroport = numAeroport;
    		this.nomAeroport = nomAeroport;
    	}
     
     
    	@Id
    	@GenericGenerator(name="serial" , strategy="increment")
    	@GeneratedValue(generator="serial")
    	@Column(name = "Num_aeroport", unique = true, nullable = false)
     
     
     
    	public int getNumAeroport() {
    		return this.numAeroport;
    	}
     
    	public void setNumAeroport(int numAeroport) {
    		this.numAeroport = numAeroport;
    	}
     
    	@Column(name = "Nom_aeroport", length = 255)
    	public String getNomAeroport() {
    		return this.Nom_aeroport;
    	}
     
    	public void setNomAeroport(String nomAeroport) {
    		this.nomAeroport = nomAeroport;
    	}
    }
    Ensuite, je te félicite d'avoir annoté de façon exhaustive la classe. Mais c'est plus lisible si les annotations sont sur les attributs plutôt que les méthodes.

    Bon, pour le problème, il manque une classe, la classe Vol.

    Cette classe est d'ailleurs liée à Aeroport.

    Je me place dans le cadre où je fait un mapping exhaustif.

    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
     
     
    @Entity
    @Table(name="VOL")
    public class Vol extends EntiteGenerique implements java.io.Serializable {
     
        private static final long serialVersionUID = 1L;
     
        @Id
    	@GenericGenerator(name="serial" , strategy="increment")
    	@GeneratedValue(generator="serial")
    	@Column(name = "Num_vol", unique = true, nullable = false)
        private int numVol;
     
       @ManyToOne(fetch=FetchType.EAGER)
       @JoinColumn(name = "Aeroport_dep", nullable=false)
       private Aeroport aeroportDepart;
     
       @ManyToOne(fetch=FetchType.EAGER)
       @JoinColumn(name = "Aeroport_arr", nullable=false)
       private Aeroport aeroportArrive;
     
       //Getter Setter
    }
    On peut ajouter, pour mapping excessif, dans la classe aéroports:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        @OneToMany(mappyBy="aeroportDepart",fetch=FetchType.LAZY)
        private Set<Vol> volsDepart;
     
        @OneToMany(mappyBy="aeroportArrive",fetch=FetchType.LAZY)
        private Set<Vol> volsArrive;
     
    //Et des Getters, et des Setters
    Ainsi, on fait une classe pour la table vol.

    Notons aussi la notion fondamentale de LAZY et EAGER.

    Dans le cas de la classe Vol, on définit un lien entre Vol et Aeroport, et en plus, on demande à Hibernate/JPA de charger (Donc du SQL en plus pour Hibernate/JPA) les aéroports qui sont liés.

    Dans la classe Aeroport, on définit le lien, on explique qu'il existe, mais avec LAZY, on explique à Hibernate que quand il charge les aéroport, il ne charge pas les vols qui sont liées.*

    Cette notion est importante, notamment pour les questions de performances.

    A partir de là, le problème devient très simple.

    On charge les vols par le HQL suivant:
    Hibernate/JPA chargera tous les Vols, mais en plus, il chargera les Aéroports liés aux vols.

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/01/2017, 13h37
  2. [WD17] faire une application qui utilise une base de données postgresql
    Par jackson2015 dans le forum WinDev
    Réponses: 1
    Dernier message: 09/10/2014, 21h43
  3. Migrer une application de Windows 98 vers Windows XP
    Par siempre dans le forum Windows
    Réponses: 1
    Dernier message: 19/07/2010, 13h22
  4. migrer une Application de struts 1 vers wicket
    Par Soulama dans le forum Wicket
    Réponses: 4
    Dernier message: 27/05/2010, 11h21
  5. installer mon application qui utilise sql server
    Par ramanov dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 13/04/2009, 12h46

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