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 !