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

JPA Java Discussion :

Mapping XML foreign key multiples


Sujet :

JPA Java

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 56
    Points : 35
    Points
    35
    Par défaut Mapping XML foreign key multiples
    Bonjour,

    Je souhaite créer un projet java qui correspond à une base de données existante. Voilà la base de données :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    CREATE TABLE cinema(
    	nom VARCHAR(255) PRIMARY KEY,
    	adresse VARCHAR(255) );
     
    CREATE TABLE salle(
    	nom VARCHAR(30) ,
    	cinema VARCHAR(255)  REFERENCES cinema(nom),
    	capacite INTEGER ,
    	PRIMARY KEY(cinema,nom) );
     
    CREATE TABLE seance(
    	debut TIMESTAMP,
    	fin TIMESTAMP,
    	salle VARCHAR(30),
    	cinema VARCHAR(255),
    	film VARCHAR(255),
    	FOREIGN KEY (cinema,salle) REFERENCES salle(cinema,nom),
    	PRIMARY KEY(cinema,salle,debut) );
     
    CREATE TABLE client(
    	num_client INTEGER PRIMARY KEY,
    	nom VARCHAR(255));
     
    CREATE TABLE reservation(
    	id INTEGER PRIMARY KEY,
    	seance TIMESTAMP,
    	salle VARCHAR(30) ,
    	cinema VARCHAR(255) ,
    	quantite INTEGER ,
    	client INTEGER REFERENCES client(num_client),
    	FOREIGN KEY (cinema,salle,seance) REFERENCES seance(cinema,salle,debut));
     
     
    CREATE SEQUENCE hibernate_sequence
    INCREMENT 1
    MINVALUE 1
    MAXVALUE 9223372036854775807
    START 1
    CACHE 1;

    J'ai créé les classe java correspondant aux classe SQL et y ai ajouté les annotations nécessaires au mapping de telle sorte à obtenir les classe suivante :

    Cinema.java :
    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
     
    @Entity
    public class Cinema {
     
        @Id 
        @Column(name="nom", nullable=false) 
        private String nom;
     
        @Column(name="adresse") 
        private String adresse;
     
        @OneToMany(mappedBy="cinema") 
        private List<Salle> salleList;
     
        @OneToMany(mappedBy="cinema") 
        private List<Seance> seanceList;
     
        @OneToMany(mappedBy="cinema") 
        private List<Reservation> reservationList;
     
        public Cinema(String nom) {
            this.nom = nom;
        }
     
        protected Cinema() {}
     
    //Getters-Setters
    }

    Client.java :
    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
    @Entity
    public class Client {
    	@Id	
    	@Column(name="num_client", nullable=false, columnDefinition = "INTEGER") 
    	private int num_client;
     
    	@Column
    	(name="nom") private String nom;
     
    	@OneToMany(mappedBy="client") 
        private List<Reservation> reservationList;
     
     
    	//Getters-Setters
    }

    Reservation.java :
    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
    35
    36
    37
    38
    39
    40
    @Entity
    public class Reservation {
     
    	@Id	
    	@Column(name="id", nullable=false, columnDefinition = "INTEGER")	
    	private int id;
     
    	@ManyToOne
    	@JoinColumn(name="debut", nullable=false) 
    	private Seance seance;
     
    	@ManyToOne
    	@JoinColumn(name="salle", nullable=false) 
    	private Salle salle;
     
    	@ManyToOne
    	@JoinColumn(name="cinema", nullable=false) 
    	private Cinema cinema;
     
    	@Column(name="quantite", columnDefinition = "INTEGER")	
    	private int quantite;
     
    	@ManyToOne
    	@JoinColumn(name="client", nullable=false)	
    	private Client client;
     
     
    	public Reservation(Seance seance, Client client)
    	{
    		this.seance = seance;
    		this.salle = seance.getSeanceId().getSalle();
    		this.cinema = seance.getSeanceId().getCinema();
    		this.client = client;
    	}
     
    	public Reservation(){}
     
     
    	//Getters-Setters
    }

    Salle.java :
    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
    @Entity
    public class Salle {
     
    	@EmbeddedId 
    	private SalleId salleId;	
     
    	@Column(name="capacite", columnDefinition = "INTEGER")	
    	private int capacite;
     
    	@OneToMany 
    	private List<Seance> seanceList;
     
    	@OneToMany 
    	private List<Reservation> reservationList;
     
    	protected Salle(){}
     
    	public Salle(Cinema cinema)
    	{
    		this.salleId.setCinema(cinema);
    	}
     
    	//Getters-Setters
    }

    SalleId.java :
    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
    35
    36
    37
    @Embeddable
    public class SalleId implements Serializable {
     
    	private static final long serialVersionUID = 1L;
     
    	@Column(name="nom", nullable=false) 
    	private String nom;
     
    	@ManyToOne
    	@JoinColumn(name="nomCinema", nullable=false) 
    	private Cinema cinema;
     
    	public SalleId(){}
     
    	public SalleId(String nom, Cinema cinema) {
    		this.nom = nom;
    		this.cinema = cinema;
    	}
     
    	//Getters-Setters
     
    	@Override
        public int hashCode() {
            return 0;
        }
     
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            return true;
        }
    }

    Seance.java :
    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
    @Entity
    public class Seance {
     
    	@EmbeddedId 
    	private SeanceId seanceId;
     
    	@Column(name="fin", columnDefinition = "TIMESTAMP")	
    	private Date fin;
     
    	@Column(name="film") 
    	private String film;
     
    	@OneToMany 
    	private List<Reservation> reservationList;
     
    	public Seance(Salle salle)
    	{
    		this.seanceId.setCinema(salle.getSalleId().getCinema());
    		this.seanceId.setSalle(salle);
    	}
     
    	public Seance(){}
     
    	//Getters-Setters
    }

    Et SeanceId.java :
    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
    35
    36
    37
    38
    39
    40
    41
    42
    @Embeddable
    public class SeanceId implements Serializable {
     
    	private static final long serialVersionUID = 1L;
     
    	@Column(name="debut", nullable=false, columnDefinition = "TIMESTAMP")	
    	private Date debut;
     
    	@ManyToOne
    	@JoinColumn(name="nomSalle", nullable=false) 
    	private Salle salle;
     
    	@ManyToOne
    	@JoinColumn(name="nomCinema", nullable=false) 
    	private Cinema cinema;
     
    	public SeanceId(){}
     
    	public SeanceId(Date debut, Salle salle, Cinema cinema) {
    		this.debut = debut;
    		this.salle = salle;
    		this.cinema = cinema;
    	}
     
    	//Getters-Setters
     
    	@Override
        public int hashCode() {
            return 0;
        }
     
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            return true;
        }
    }

    Mais lorsque je lance mon programme de test pour vérifier la cohérence entre ma base de données et mon code, je reçois une exception avec pour cause :
    Caused by: org.hibernate.AnnotationException: A Foreign key refering mif18.orm.Salle from mif18.orm.Seance has the wrong number of column. should be 2

    J'avoue que je ne comprend pas vraiment ce que ça veut dire ni ce que je dois faire... J'ai cherché d'autres sujets similaires sur Google et je ne vois pas ce qui cloche dans mon code

    Merci d'avance pour votre aide !

  2. #2
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 56
    Points : 35
    Points
    35
    Par défaut
    En faisant quelques essais avec @JoinTable, j'ai bien compris que le problème venait du fait d'avoir des clés primaires composées de plusieurs éléments (dont des clés étrangères) mais je ne trouve pas la syntaxe correcte pour pallier au problème... Des idées ?

  3. #3
    Membre chevronné 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
    Points : 2 120
    Points
    2 120
    Par défaut
    Salut,
    pourquoi ne travailles-tu pas avec des identifiants numerique?
    par exemple pour cinema, tu auras:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE TABLE cinema(
            cinema_id int(11) primary key
    	nom VARCHAR(255),
    	adresse VARCHAR(255) );
    E passant peux tu nous dire avec quoi tu developpes(EDI, version java, etc..)?
    car il ya toujours une possiblité de créer tes classes a partir du schema present dans ta base de données.

    Eric

  4. #4
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 56
    Points : 35
    Points
    35
    Par défaut
    Bonjour,

    Les identifiants m'étaient imposés, sinon j'aurais préféré du numérique aussi

    Entre temps j'ai trouvé ma solution (enfin je crois, ça passait les test en tout cas), mais ça nécessitait beaucoup de changement du coup. Je vais peux passer ce topic en résolu, s'il y a des intéressés je les laisse me mp

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 31/05/2011, 21h24
  2. Réponses: 9
    Dernier message: 31/12/2010, 12h08
  3. [NHibernate] Mapping foreign key
    Par Seth77 dans le forum NHibernate
    Réponses: 2
    Dernier message: 02/08/2010, 09h57
  4. Problème de mapping Foreign key one-to-one
    Par chady dans le forum Hibernate
    Réponses: 3
    Dernier message: 20/06/2010, 23h35
  5. foreign key multiple (vers 2 tables ou plus)
    Par Bombastus dans le forum Langage SQL
    Réponses: 2
    Dernier message: 25/07/2006, 16h26

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