Partage
  • Partager sur Facebook
  • Partager sur Twitter

Table de jointure avec trois tables

Avec Spring boot (java 1.8) et hibernate

Sujet résolu
7 août 2018 à 17:43:34

Bonjour ou bonsoir,

Je dois avouer que je suis un peu bloquée sur une manière de faire. Actuellement, sur mon projet, je me dois de mapper une table de jointure qui réunit 3 tables. Ces tables qui se réunissent à la table de jointure sont du one-to-many.

Pour mieux comprendre, voici la partie du schéma relationnel en question :

schéma relationnel pour une table de jointure à trois tables

Comme on peut le voir, un award a une relation one-to-many avec project_award, de même pour session et project.

Ma question est la suivante : "Comment mapper cette table de jointure avec hibernate en utilisant des annotations ?" J'ai vu pas mal d'exemple avec du one-to-many, mais sans table de jointure, voire avec une seule table de jointure avec deux tables (pour du many-to-many).

Si ça peut vous aider, voici le code en question :

Pour Project :

package *.project;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.springframework.lang.NonNull;


@Entity
@Table(name = "PROJECT")
public class Project {
	
	@Id @GeneratedValue
	@Column(name = "project_id")
	private long id;
	
	@Column(name = "project_name") @NonNull
	private String name;
	
	@Column(name = "project_date") @NonNull
	private Date date;
	
	@Column(name = "project_supportId") @NonNull
	private int supportId;
	
	@Column(name = "project_typeId") @NonNull
	private int typeId;
	
	@Column(name = "project_universeId") @NonNull
	private int universeId;
	
	@Column(name = "project_stateId") @NonNull
	private int stateId;
	
	@Column(name = "project_userId") @NonNull
	private long userId;
	
// Le code en question.
	@OneToMany(cascade = CascadeType.ALL,
            fetch = FetchType.LAZY,
            mappedBy = "post")
	private Set<ProjectAward> projectAward = new HashSet<>();
	
	// == ACCESSEURS ========================================
	
// Vide pour gagner de la place pour l'exemple

}

Pour Session :

package *.session;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

import org.springframework.lang.NonNull;

@Entity
@Table(name = "SESSION")
public class Session {
	
	@Id @GeneratedValue
	@Column(name = "session_id")
	private int id;
	
	@Column(name = "session_year") @NonNull
	private int year;
	
	// == ACCESSEURS ==========================================
	
// Vide pour gagner de la place

}

Pour Award :

package *.award;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

import org.springframework.lang.NonNull;

@Entity
@Table(name = "AWARD")
public class Award {

	@Id @GeneratedValue
	@Column(name = "award_id")
	private int id;
	
	@Column(name = "award_name") @NonNull
	private String name;
	
	@Column(name = "award_text")
	private String text;
	
	// == ACCESSEURS ================================================
	
// Vide pour gagner de la place
	
}


Et la table de jointure (désolée pour le bazar dans cette classe, je fais pas mal de test pour comprendre comment une table de jointure avec plus de deux tables fonctionne) :

package *.project;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import org.springframework.lang.NonNull;

@Entity
@Table(name = "PROJECT_AWARD")
public class ProjectAward {
	
//	@Column(name = "projectAward_awardId") @NonNull
//	private int awardId;
	
//	@Column(name = "projectAward_projectId") @NonNull
	@ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "projectAward_projectId", nullable = false)
	private long projectId;
	
//	@Column(name = "projectAward_sessionId") @NonNull
//	private int sessionId;

	// == ACCESSEURS ==================================================
	
// Vide pour encore plus de place...
	
}


Merci d'avance.

-
Edité par RutsukuFushin 7 août 2018 à 17:44:10

  • Partager sur Facebook
  • Partager sur Twitter
8 août 2018 à 10:46:23

Hello,

Est ce tu peux donner les relations qu'il y a entres tes tables pour que je puisse essayer afin de t'aider ?

  • Partager sur Facebook
  • Partager sur Twitter
Starcraft Broodwar is BACK !  MP pour jouer ensemble ! :D
8 août 2018 à 10:56:46

Salut. Il faut une classe pour représenter la clé composite, une proposition

@IdClass(ProjectAward.PK.class)
public class ProjectAward 
{
     
    @Id
    @ManyToOne
    @JoinColumn(name = "projectAward_awardId", referencedColumnName = "award_id")
    private Award award;
    
    @Id
    @ManyToOne
    @JoinColumn(name = "projectAward_projectId", referencedColumnName = "project_id")
    private Project project;
    
    @Id
    @ManyToOne
    @JoinColumn(name = "projectAward_sessionId", referencedColumnName = "session_id")
    private Session session;
    
    //getters et setters(pour la classe  ProjectAward )
public static class PK implements Serializable { Long award; Long project; Long session; //gettets et setters, methodes equals et hashCode (pour la classe PK) } }



-
Edité par kulturman 8 août 2018 à 11:00:06

  • Partager sur Facebook
  • Partager sur Twitter
8 août 2018 à 11:28:42

Hitch : j'ai donné ça dans le schéma relationnel. Sans compter l'explication dessous :

"Comme on peut le voir, un award a une relation one-to-many avec project_award, de même pour session et project."

Donc, 

Session -|---------------------------------|

                                                         ^

                                                         |                                                          

Award -|----------------------<- Award_Project ->--------------------|- Project

Pour résumer : Award_Project est composé uniquement des clefs primaires de Session, de Award et de Project.

kulturman : Merci beaucoup, ton code a fonctionné. J'aurai jamais pensé qu'il fallait faire un code aussi lourd pour faire ce truc simple. Mais au moins, je vois et comprends mieux.

Je mets le sujet en résolu.

  • Partager sur Facebook
  • Partager sur Twitter