Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
976 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [Résolu][Hibernate] Mapping tricky entre 4 tables

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Résolu][Hibernate] Mapping tricky entre 4 tables

n°1927865
brisssou
8-/
Posté le 30-09-2009 à 10:37:42  profilanswer
 

Bonjour à tous,
 
J'ai une chouette (sic) appli a reprendre de PHP vers Java, tout ça sans toucher à la base de données. Ca poserait moins de problèmes si la base était correcte. D'où mon problème :
 
Voilà un bout du schéma du schéma :
 
                                  [Rôle]
                                      ^
                                      |
                                      |
                                      |
                                      V
[User]<--------------->[UserEntity]<--------------->[Entity]
                              (char (1) mail)
 
 
J'ai donc une table de jointure entre trois autres tables qui me permet de connaitre le rôle d'un utilisateur sur une entité. Mais cette table me dit aussi si je doit envoyer en mail ou pas à l'utilisateur sur modification de l'entité.
 
Dans la table UserEntity, je me retrouve donc avec 4 champs, donc 3 font partie de la clef.
 
Si il n'y avait pas eu le mail, dans les entités j'aurai mappé autant de listes d'utilisateurs que de rôles (table fixe). Malheureusement le mail est là, et m'a (semble-t-il) forcé à avoir un objet UserEntity La génération auto hibernate m'a fait un objet avec un Id complexe et tous les champs :

Code :
  1. public class UserEntity implements java.io.Serializable {
  2.  
  3.     /**
  4.      *
  5.      */
  6.     private static final long serialVersionUID = 9105783703237347058L;
  7.  
  8.     @EmbeddedId
  9.     private UserEntityId id;
  10.  
  11.     @ManyToOne(fetch = FetchType.LAZY)
  12.     @JoinColumn(name = "FK_ENTITY", nullable = false, insertable = false, updatable = false)
  13.     private Entity entity;
  14.  
  15.     @ManyToOne(fetch = FetchType.LAZY)
  16.     @JoinColumn(name = "FK_IDENT", nullable = false, insertable = false, updatable = false)
  17.     private User user;
  18.  
  19.     @ManyToOne(fetch = FetchType.LAZY)
  20.     @JoinColumn(name = "FK_ROLE", nullable = false, insertable = false, updatable = false)
  21.     private Role role;
  22.  
  23.     @Column(name = "F_MAIL", nullable = false, precision = 1, scale = 0)
  24.     private boolean mail;
  25. }
  26.  
  27. @Embeddable
  28. public class UserEntityId implements java.io.Serializable {
  29.  
  30.     /**
  31.      *
  32.      */
  33.     private static final long serialVersionUID = 3065532416096191064L;
  34.  
  35.     @ManyToOne(fetch = FetchType.EAGER,optional=false)
  36.     @JoinColumn(name = "FK_IDENT", insertable=false, updatable=false, nullable=false)
  37.     private User user;
  38.  
  39.  
  40.     @ManyToOne(fetch = FetchType.EAGER,optional=false)
  41.     @JoinColumn(name = "FK_ENTITY", insertable=false, updatable=false, nullable=false)
  42.     private Entity entity;
  43.  
  44.     @ManyToOne(fetch = FetchType.EAGER,optional=false)
  45.     @JoinColumn(name = "FK_ROLE", insertable=false, updatable=false, nullable=false, unique=false)
  46.     private Role role;
  47. }


 
On continue avec le mapping de Entity :

Code :
  1. public class Entity {
  2.  
  3.     @OneToMany(fetch = FetchType.LAZY)
  4.     @JoinColumn(name="FK_ENTITY" )
  5.     @SQLDeleteAll(sql="DELETE FROM UserEntity WHERE fk_entity = ?", check = ResultCheckStyle.COUNT)
  6.     @SQLInsert(sql="INSERT INTO UserEntity (FK_entity, FK_IDENT, FK_ROLE, F_MAIL) VALUES (?, ?, ?, ?)", check = ResultCheckStyle.COUNT)
  7. //    @SQLDelete(sql="DELETE FROM UserEntity WHERE fk_entity = ? AND FK_IDENT = ? AND fk_entity = ? AND FK_ROLE = ?", check = ResultCheckStyle.COUNT)
  8. //    @SQLUpdate(sql="UPDATE UserEntity SET FK_entity = ?, FK_IDENT = ?, FK_ROLE = ?, F_MAIL = ? WHERE FK_entity = ?, FK_IDENT = ?, FK_ROLE = ?", check = ResultCheckStyle.COUNT)
  9.     private Set<UserEntity> userEntities = new HashSet<UserEntity>(0);
  10. }


 
Et avec ça, quand j'essaie de mettre à jour la liste des userEntity de mon entité, hibernate me génère ce code :

Code :
  1. UPDATE userEntity SET FK_entity=NULL WHERE FK_entity=? AND FK_IDENT=? AND FK_entity=? AND FK_ROLE=?


avec  

Code :
  1. 2009-09-30 10:03:18 TRACE [org.hibernate.type.IntegerType nullSafeSet(l:151)] binding '140381' to parameter: 1
  2. 2009-09-30 10:03:18 TRACE [org.hibernate.type.StringType nullSafeSet(l:151)] binding 'IFBU6444' to parameter: 2
  3. 2009-09-30 10:03:18 TRACE [org.hibernate.type.IntegerType nullSafeSet(l:151)] binding '140381' to parameter: 3
  4. 2009-09-30 10:03:18 TRACE [org.hibernate.type.IntegerType nullSafeSet(l:151)] binding '1' to parameter: 4


 
donc la grande question (enfin)  
pourquoi il essaye de me mettre un NULL, alors que j'ai une vrai valeur à setter ?
pourquoi l'entité est deux fois dans la requête ??
 
Mon mapping pue, j'en doute pas une seconde. Des idées pour l'améliorer ?


Message édité par brisssou le 30-09-2009 à 15:33:05

---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
mood
Publicité
Posté le 30-09-2009 à 10:37:42  profilanswer
 

n°1927989
brisssou
8-/
Posté le 30-09-2009 à 15:32:24  profilanswer
 

donc la réponse :
Le mapping est VRAIMENT dégueux.
 
Avec ça ça marche (mais pas dit que ce soit plus propre) :

Code :
  1. @Table(name = "user_entity" )
  2. @IdClass(entityAdministratorId.class)
  3. public class UserEntity implements java.io.Serializable {
  4.  
  5.  
  6.     @Id
  7.     @Column(name = "FK_ENTITY" )
  8.     private Integer entityId;
  9.     @Id
  10.     @Column(name = "FK_IDENT" )
  11.     private String userId;
  12.     @Id
  13.     @Column(name = "FK_ROLE" )
  14.     private Integer roleId;
  15.  
  16.     @ManyToOne(fetch = FetchType.LAZY)
  17.     @JoinColumn(name = "FK_entity", nullable = false, insertable = false, updatable = false)
  18.     private Entity entity;
  19.  
  20.     @ManyToOne(fetch = FetchType.LAZY)
  21.     @JoinColumn(name = "FK_IDENT", nullable = false, insertable = false, updatable = false)
  22.     private User user;
  23.  
  24.     @ManyToOne(fetch = FetchType.LAZY)
  25.     @JoinColumn(name = "FK_ROLE", nullable = false, insertable = false, updatable = false)
  26.     private Role role;
  27.  
  28.     @Column(name = "F_MAIL", nullable = false, precision = 1, scale = 0)
  29.     private boolean mail;
  30. }
  31.  
  32.  
  33. @Embeddable
  34. public class UserEntityId implements java.io.Serializable {
  35.  
  36.     @Column(name = "FK_entity" )
  37.     private Integer poolId;
  38.  
  39.     @Column(name = "FK_IDENT" )
  40.     private String userId;
  41.  
  42.     @Column(name = "FK_ROLE" )
  43.     private Integer roleId;
  44. }
  45.  
  46. public class Pool {
  47.     @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
  48.     @Cascade(org.hibernate.annotations.CascadeType.ALL)
  49.     @JoinColumn(name="FK_entity" )
  50.     @SQLDelete(sql="DELETE FROM USER_entity WHERE fk_entity = ? AND FK_IDENT = ? AND fk_pool = ? AND FK_ROLE = ?", check = ResultCheckStyle.COUNT)
  51.     private Set<UserEntity> poolAdministrators = new HashSet<UserEntity>(0);
  52. }


 
et voilà !


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [Résolu][Hibernate] Mapping tricky entre 4 tables

 

Sujets relatifs
Decalage dans internet explorer 6 [résolu][Résolu] Stripes, JBoss et EJB3
[RESOLU] Rafraichissement d'une barre d'état[resolu] IE6 object flash et <!--[ if IE]>
[RESOLU] <li> d'un sous menu qui s'affiche horizontalementProbleme pour placer des éléments swing
[RESOLU]Optimisation d'une requête SQL[AS] zoom avec un onMouseWheel sur plusieurs clip [RESOLU]
[RESOLU]Debutant en C++, petite question a propos d'un programme[Résolu] Hack CSS possible sur positionnement hauteur d'un div ?
Plus de sujets relatifs à : [Résolu][Hibernate] Mapping tricky entre 4 tables


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR