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.  [ 16 posts ]  Go to page 1, 2  Next
Author Message
 Post subject: Acceder à une table dont les colonnes changent
PostPosted: Wed Mar 14, 2007 4:38 am 
Beginner
Beginner

Joined: Wed Mar 14, 2007 4:29 am
Posts: 33
Bonjour,

je me retrouve face à la problematique suivante et je me demande s'il existe une solution nhibernate:

-J'ai une table dont les colonnes peuvent êtres créées ou supprimées depuis mon application par l'utilisateur. (Il peut ajouter les colonnes qu'il a besoin)
-Cette table doit être visualisable depuis une sorte de datagrid dans mon appli.

Est ce qu'il est possible de gerer depuis mon appli, l'ajout dynamique de colonnes dans une table, et de la meme facon, pour l'affichage dans mon tableau, la selection dynamique des colonnes ?

A priori non, dans la mesure ou si je rajoute des colonnes au fichier de mapping, je peux pas ajouter des accesseurs dynamiquement dans mon objet métier.
Si j'utilise la création de requete createSql, nhibernate utilise bien les fichiers de mappings ? Le contraire m'arrangerait...


une idée ?


Top
 Profile  
 
 Post subject:
PostPosted: Wed Mar 14, 2007 9:04 am 
Expert
Expert

Joined: Thu Sep 04, 2003 8:23 am
Posts: 368
Pour gérer cela avec hibernate il pourrait être plus simple d'utiliser un lien one-to-many mappé à l'aide d'une map. La clé serait le nom de la propriété ajoutée.
L'utilisateur peut ensuite visualiser la chose comme une datagrid mais en base tu as deux tables avec un lien entre elles. C'est plus évolutif et le mapping n'est alors plus dynamique

_________________
Seb
(Please don't forget to give credits if you found this answer useful :)


Top
 Profile  
 
 Post subject:
PostPosted: Wed Mar 14, 2007 10:00 am 
Beginner
Beginner

Joined: Wed Mar 14, 2007 4:29 am
Posts: 33
Mais le problème c'est que pour chaque colonne ajoutée, je dois le spécifier dans le fichier de mapping, et qu'il faut créer l'accesseur correspondant dans l'objet métier, je me trompe ? Et ca, ca me parait difficilement réalisable sans recompiler.

Merci de ta réponse


Top
 Profile  
 
 Post subject:
PostPosted: Wed Mar 14, 2007 10:57 am 
Expert
Expert

Joined: Thu Sep 04, 2003 8:23 am
Posts: 368
Non ce que je proposais c'est de modéliser ton problème différemment. Lorsque tu ajoutes un attribut dans ta grid, tu n'ajoutes pas un attribut à ta classe java mais tu ajoutes un élément à une map dont le nom de l'attribut est la clé (cf http://www.hibernate.org/hib_docs/v3/re ... tions.html pour le mapping des maps)

C'est une vision différente du problème. La correspondance entre ta grid et ta base de données est moins directe mais tu modélises ainsi tes attributs supplémentaires :
Code:
public class MaClasse
{
  private Map<String, ???> attributs;

  // accesseurs ...
}

_________________
Seb
(Please don't forget to give credits if you found this answer useful :)


Top
 Profile  
 
 Post subject:
PostPosted: Wed Mar 14, 2007 11:19 am 
Beginner
Beginner

Joined: Wed Mar 14, 2007 4:29 am
Posts: 33
oki merci, je vais essayer çà !
Pour créer une colonne j'ai rien vu par contre, il existe quelque chose ? A part peut etre passer par un proc stockée ?


Top
 Profile  
 
 Post subject:
PostPosted: Wed Mar 14, 2007 11:36 am 
Expert
Expert

Joined: Thu Sep 04, 2003 8:23 am
Posts: 368
Que veux tu dire par là

Hibernate utilise l'objet Configuration pour créer un schéma de base à partir des metadata. Si tu veux faire cela à chaud, je pense qu'il va falloir que tu rentres dans hibernate et que tu comprennes ses mécanismes interne. Il existe bien un objet Column dans hibernate qui permet de créer une colonne mais il n'est pas prévu qu'il soit utilisable depuis une application tierce.
Si tu veux réellement créer des colonnes à chaud je ne suis pas sûr qu'hibernate soit l'outil approprié pour ton mapping, il serait peut être préférable dans ce cas t'utiliser une couche jdbc maison mais de toutes façons tu auras d'autres problèmes comme la création des attributs java à la volée.
Dans un cas comme cela il est souvent préférable de faire une meta-représentation de l'objet : un objet contient une liste (ou une map) d'attributs et de mapper cette méta représentation avec hibernate

_________________
Seb
(Please don't forget to give credits if you found this answer useful :)


Top
 Profile  
 
 Post subject:
PostPosted: Thu Mar 15, 2007 4:11 am 
Beginner
Beginner

Joined: Wed Mar 14, 2007 4:29 am
Posts: 33
Oui je me doute bien que ce n'est pas le plus approprié :(
En fait d'un coté 'jai une appli qui peut créer de nouvelles colonnes, et de l'autre une qui doit pouvoir les lire.

Donc je veux

-Pouvoir créer ses colonnes depuis une interface.
-Pouvoir lire leur contenu, sans connaitre le nbre de colonnes a l'avance depuis une autre interface. Et la je suppose il faut je regarde du coté de la collection "map" que tu m'as présenté.

Le tout te parait possible ?


Top
 Profile  
 
 Post subject:
PostPosted: Thu Mar 15, 2007 4:21 am 
Expert
Expert

Joined: Thu Sep 04, 2003 8:23 am
Posts: 368
Si tu as le contrôle sur ton schema de base, c'est tout à fait possible et je pense beaucoup plus simple avec deux tables distinctes.
Le lien entre les deux peut être une map ou une liste, c'est à toi de voir. Le tout c'est de faire une modélisation de plus haut niveau (ou méta modélisation). Tu modélises le fait qu'un objet peut avoir n attributs et tu stockes cela en base plutôt que d'essayer de mettre à jour ton objet à chaud

_________________
Seb
(Please don't forget to give credits if you found this answer useful :)


Top
 Profile  
 
 Post subject:
PostPosted: Thu Mar 15, 2007 6:59 am 
Beginner
Beginner

Joined: Wed Mar 14, 2007 4:29 am
Posts: 33
Quelque chose m'échappe,

j'ai essayé d'utiliser l'objet Map sur ma table dédiée aux nouvelles colonnes, mais mis à part la clef je ne peux prendre en compte qu'une nouvelle colonne, exemple:

<map name="Colonnes" table="nouvellescolonnes">
<key column="iduser" />
<index column="id" type="int" />
<element column="nouvellecolonne1" type="string" />
</map>

Je ne peux pas ajouter un autre <element../> vu que c'est une hashtable.
Du coup je vois pas comment faire

:(


Top
 Profile  
 
 Post subject:
PostPosted: Thu Mar 15, 2007 7:02 am 
Beginner
Beginner

Joined: Wed Mar 14, 2007 4:29 am
Posts: 33
Quand tu dis "Tu modélises le fait qu'un objet peut avoir n attributs", tu veux dire ajouter un certain nombre attributs (donc d'accesseurs) en avance ? Plutot que de créer des colonnes ?


Top
 Profile  
 
 Post subject:
PostPosted: Thu Mar 15, 2007 7:09 am 
Expert
Expert

Joined: Thu Sep 04, 2003 8:23 am
Posts: 368
Non

Le but c'est de modéliser n'importe quel objet qui aurait n'importe quel nombre d'attribut plutôt que de modéliser directement ton objet toto avec les attributs a, b, c, d

Quelque chose du type
Code:
public class ObjetVariable {
   private List<Attribut> attributs;
   
   public Attribut getAttribut(String nom)
   {
      // Retourne l'attribut avec le nom
   }
   public void addAttribut(String nom)
   {
      // Ajoute dans la liste un nouvel attribut avec le nom précisé
   }
}
public class Attribut {
   private String nom;
   private String valeur;
   public String getNom() {
      return nom;
   }
   public void setNom(String nom) {
      this.nom = nom;
   }
   public String getValeur() {
      return valeur;
   }
   public void setValeur(String valeur) {
      this.valeur = valeur;
   }
}

Du coup au lieu de faire
Code:
objet.setA(...);
objet.setB(...);
objet.setC(...);

tu fais
Code:
objet.setAttribut("a", ...);
objet.setAttribut("b", ...);
objet.setAttribut("c", ...);

Et tu conserve en base une liste d'attributs pour un objet variable (ou une map si tu préfères
C'est une solution plus générique qui t'évite d'avoir à changer la représentation de ton objet lorsque tu ajoutes un attribut (c'est juste un ajout d'un élément dans une liste d'attributs).
En espérant avoir été plus clair

_________________
Seb
(Please don't forget to give credits if you found this answer useful :)


Top
 Profile  
 
 Post subject:
PostPosted: Thu Mar 15, 2007 8:55 am 
Beginner
Beginner

Joined: Wed Mar 14, 2007 4:29 am
Posts: 33
oki, donc si je comprend bien (^^) on définit un attribut dont "nom" est le nom correspondant à la colonne en quelque sorte, et "valeur", la valeur du champ pour cette colonne sur une ligne précise.

Par contre ce que je ne vois pas comment faire, c'est spécifier a nhibernate qu'il doit utiliser la liste comme étant mes nouveaux accesseurs.
Je ne sais pas comment lui dire au niveau du fichier de mapping.
Si tu pouvais m'éclairer à ce niveau....

(désolé j'ai du mal a comprendre comment appliquer cette solution, mais merci encore pour tes réponses !)


Top
 Profile  
 
 Post subject:
PostPosted: Thu Mar 15, 2007 9:09 am 
Expert
Expert

Joined: Thu Sep 04, 2003 8:23 am
Posts: 368
Oublie tes nouveaux accesseurs, tu définis un one-to-many au niveau d'hibernate avec une liste ou une map comme tu veux.

Ensuite tu manipules ta liste dans ton logiciel, jamais tes attributs en tant que tels. C'est une vision complètement différente de ce que tu proposais au départ mais qui je pense est plus facile à mettre en oeuvre avec hibernate.

C'est souvent comme cela que sont modélisés les objets paramétrés (avec un nombre d'attributs variables)

_________________
Seb
(Please don't forget to give credits if you found this answer useful :)


Top
 Profile  
 
 Post subject:
PostPosted: Thu Mar 15, 2007 10:08 am 
Beginner
Beginner

Joined: Wed Mar 14, 2007 4:29 am
Posts: 33
Tu aurais pas un exemple ?
J'suis désolé j'ai beau chercher j'ai du mal a trouver comment faire.... :(


Top
 Profile  
 
 Post subject:
PostPosted: Thu Mar 15, 2007 10:19 am 
Expert
Expert

Joined: Thu Sep 04, 2003 8:23 am
Posts: 368
Mon exemple se trouve quelque posts plus haut (ObjetVariable / Attribut). Si tu ne le sens pas tu n'es pas obligé de faire comme cela, c'est juste une suggestion

_________________
Seb
(Please don't forget to give credits if you found this answer useful :)


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 16 posts ]  Go to page 1, 2  Next

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.