Bonjour,

J'utilise hibernate dans un projet perso pour m'entraîner. Je bute sur un problème de mapping. Je vais essayer de le reproduire avec un exemple simple :

J'ai 3 entités.

- Emailing
id_emailing
date_envoi

- GroupeClient
id_group
nom_groupe

- RegleMarketing
id_regle
id_emailing
id_group
nom_regle
priorite

J'élimine les parties moins intéressantes du modèle en gros, ça fonctionne comme ceci :

1) L'utilisateur crée des campagnes d'emailing. (la table Emailing)
2) Il peut ensuite définir pour chaque groupe de client existant quels sont les règles qui vont s'appliquer pour l'envoi des mails, les groupes sont globaux au compte de l'utilisateur. Ainsi plusieurs campagnes peuvent utiliser le même groupe.
3) Les règles sont évaluées dans l'ordre de leur priorité, la priorité vaut au sein du couple (groupe, emailing), chaque couple ayant des règles différentes.

Au niveau interface utilisateur, ça se passe comme ça :
1) Le type crée une campagne
2) On l'amène sur un écran de choix du groupe
3) Il rentre les règles pour le groupe choisi.

Assez simple hein? Je vois assez bien comment mapper ma classe RegleMarketing en lui donnant 2 champs :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
private RegleMarketing {
 
   Emailing campagneEmailing; //mappé vers la campagne parent
   GroupeClient groupe; //mappé vers le groupe parent
 
   int priorite;
}
Par contre, je patauge dans le sens inverse...

Je peux pas depuis Emailing avoir une simple List<RegleMarketing> car ça me retournerait les règles pour tout groupe confondu.

Je pourrais certes utiliser un contructeur du style

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
public RegleMarketing( Emailing, campagne GroupeClient publicCible)
pour la création de règle, mais cela m'ennuie car je ne saurai pas comment gérer et numéroter correctement les priorités de mes règles... Il aurait fallu que j'ai une façon de grouper mes règles dans un conteneur de ce genre :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
public class GroupeRegle
{
    public GroupeRegle() 
 
    List<RegleMarketing> regles;
 
    public void ajouteRegle( RegleMarketing regle ) {...}
    public void changePriorite( RegleMarketing regle ) {...}
}
Mais cela nécessiterait à ma connaissance une table intermédiaire dans la base de données, et je ne peux pas modifier le schéma.

En dernier recours, je pourrais ne pas mapper du tout les relations

Groupe -> Regle
Emailing -> Regle

Et utiliser un service du style

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
public class RegleManager {
 
public List<RegleMarketing> trouveRegles( Emailing campagne, GroupeClient pub) {
 
}
 
public void ajouteRegle( Emailing campagne, GroupeClient pub, RegleMarketing regle  ) {
 
   //inserer et calculer la priorité ici 
}
 
}
Mais ce serait moins cool.
Des suggestions pour réaliser ce mapping?