Bonjour/soir,
Je confronte le problème classique suivant de mapping avec hibernate. J'ai trois tables : Evaluation, Student et Evaluee se présentant sous cette forme :
EVALUATION ( EVALUATION_ID INTEGER, /* clef primaire avec sequence Oracle */ DESCRIPTION VARCHAR2(60), STATUS VARCHAR2(10), ... )
STUDENT ( STUDENT_ID INTEGER, /* clef primaire avec sequence oracle */ FIRST_NAME VARCHAR2(60), LAST_NAME VARCHAR2(60), ... )
EVALUEE ( EVALUATION_ID INTEGER, /* reference evaluation.evaluation_id */ STUDENT_ID INTEGER, /* reference evaluation.evaluation_id */ GRADE NUMBER(5,2), MAXIMUM_GRADE (5,2), ... )
La clef primaire de la table Evaluee est composite (EVALUATION_ID,STUDENT_ID)
Mon problème est le suivant. Je veux créer une collection d'Evaluee dans l'entité Evaluation :
a) quelle est la façon correcte de mapper la collection ? OneToMany ou encore CollectionOfElements ?
Il faut dire que j'ai essayé les deux méthodes et je confronte un problème dans chaque cas ...
1) OneToMany : je veux pouvoir créer l'arbre d'objets (evaluation + collection evaluee) et le sauvegarder en persistant l'évaluation, cependant dans ce cas je ne sais comment dire à Hibernate d'utiliser comme valeur de la clef primaire de Evaluee les clefs des tables Evaluation et Student ? La solution serait de sauvegarder d'abord l'évaluation et ensuite affecter le nouvel objet retourné par hibernate à chaque Evaluee mais je trouve que la façon de procéder est vache si je veux que l'ensemble soit atomique ... ex si un problème se produit lors de l'enregistrement d'un Evaluee, je dois aller moi-même supprimer l'évaluation. N'y a-t-il pas une solution plus élégante ?
2) CollectionOfElements : je pencherais pour cette solution vu qu'il n'y a pas de référence partagée pour la table Evaluee ( Donc selon les bouquins Hibernate "Java Persistence with Hibernate, 2007", ce serait un candidat parfait). Dans ma tentative j'ai réalisé le mapping comme suit pour la table Evaluation
// @CollectionOfElements // @JoinTable ( // name="EVALUATION_POPULATION", // joinColumns = @JoinColumn(name = "ENROLMENT_ID", nullable = false) // ) // @CollectionId ( // columns = @Column(name="PERSON_ID"), // type = @Type(type="long"), // generator = "assigned" // ) // private Collection<Evaluee> evaluees = new ArrayList<Evaluee>();
mais dans ce cas le problème est que je suis incapable d'accéder au champ person_id pour lui assigner une valeur. D'autre part Hibernate se plaint si j'ajoute un mapping comme suit au niveau de la table Evaluee
@Basic(optional = false) @JoinColumn(name = "PERSON_ID", referencedColumnName = "PERSON_ID", nullable = false) @ManyToOne(optional = false, fetch = FetchType.LAZY) private Student student;
----------------------------------------
Je rencontre ce cas fréquemment dans mon modèle (j'ai beaucoup de clefs composites) et j'aimerais trouver une solution modèle (Pattern) à ce cas ...
Merci
|