-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 
Author Message
 Post subject: Cas classique de Mapping
PostPosted: Fri Sep 04, 2009 11:41 am 
Newbie

Joined: Fri Sep 04, 2009 11:11 am
Posts: 1
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


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.