IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JPA Java Discussion :

@Embedded et tableaux


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 19
    Par défaut @Embedded et tableaux
    Je voudrai qu'un entity bean contienne un tableau d'objects embendable.
    L'exemple suivant n'est pas forcément le meilleur en terme de datamodel mais c'est que je voudrai faire avec d'aures objects...

    J'ai un object Person et un object "embendable" address.

    est il possible d'avoir:

    Class Person {

    @Embended
    Collection<Address> addresses;

    }

    Si cela n'est pas possible il y t'il une alternative afin qu'un object contienne un tableau de sous objets sans les mapper dans d'autres tables ?

  2. #2
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Bonsoir,
    Non, ça n'a pas le moindre sens, car on travaille sur un SGBR, R=Relationnel, et dans le modèle Relationnel, il n'y a pas de notion d'ensembles/collections.
    Il faut obligatoirement passer par une autre table (+1 pour le lien éventuellement).

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 19
    Par défaut
    Citation Envoyé par djo.mos Voir le message
    Bonsoir,
    Non, ça n'a pas le moindre sens, car on travaille sur un SGBR, R=Relationnel, et dans le modèle Relationnel, il n'y a pas de notion d'ensembles/collections.
    Il faut obligatoirement passer par une autre table (+1 pour le lien éventuellement).
    Le relationnel, c'est bien...mais parfois, pour obtenir un max de perf, il vaut mieux ne pas trop éclater les tables !!!
    Donc ma question n'est pas trop stupide car j'essaie de diminuer le nombre d'accés base...et il est préférable de charger un gros object plutot que 10 petits...(surtout quand le fait d'en avoir 10 n'apporte rien...).

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par fvisticot Voir le message
    Je voudrai qu'un entity bean contienne un tableau d'objects embendable.
    L'exemple suivant n'est pas forcément le meilleur en terme de datamodel mais c'est que je voudrai faire avec d'aures objects...

    J'ai un object Person et un object "embendable" address.

    est il possible d'avoir:

    Class Person {

    @Embended
    Collection<Address> addresses;

    }

    Si cela n'est pas possible il y t'il une alternative afin qu'un object contienne un tableau de sous objets sans les mapper dans d'autres tables ?
    les UserType…

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 28
    Par défaut
    Salut,

    Ton objet de type Adresse est dit objet 'composite', ce qui le rend dépendant d'un autre objet ( dans ton cas dépendant de Personne ).

    L'annotation @Embedable doit se trouver sur ta classe Adresse et non dans ta classe Personne car c'est l'Adresse qui compose la personne.

    Par contre si tu compte utiliser ta collection met en place une association toMany.

    Bon courage.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 19
    Par défaut
    Citation Envoyé par JeitEmgie Voir le message
    les UserType…
    Merci pour l'idée, je n'y avait pas pensé.
    Les annotations pour les UserTypes ne sont pas super bien documentées

    http://www.hibernate.org/hib_docs/an...n/html_single/
    section 2.4.3.3

    Est ce que ces annotations ont quelque chose à voir avec les UserType "classique" hibernate et si oui est ce que je peux les utiliser avec ejb3 d'hibernate ?
    http://www.hibernate.org/hib_docs/v3.../UserType.html

    Comment vois tu la facon dont je pourais procéder afin d'encapsuler mon tableau d'adresses à l'interieur de ma table person ??
    Type binaire en base qui serait la serialization de mon tableau...je n'ai pas les idées claire la dessus...peux tu m'aider SVP.

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par fvisticot Voir le message
    Merci pour l'idée, je n'y avait pas pensé.
    Les annotations pour les UserTypes ne sont pas super bien documentées

    http://www.hibernate.org/hib_docs/an...n/html_single/
    section 2.4.3.3

    Est ce que ces annotations ont quelque chose à voir avec les UserType "classique" hibernate et si oui est ce que je peux les utiliser avec ejb3 d'hibernate ?
    http://www.hibernate.org/hib_docs/v3.../UserType.html

    Comment vois tu la facon dont je pourais procéder afin d'encapsuler mon tableau d'adresses à l'interieur de ma table person ??
    Type binaire en base qui serait la serialization de mon tableau...je n'ai pas les idées claire la dessus...peux tu m'aider SVP.
    créez un type EmbeddedCollection qui sera un wrapper sur une Collection + une classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    public class EmbeddedCollectionUserType implements UserType {
       private static final int[] SQL_TYPES= { Types.VARCHAR } ;
     
        /*
         * (non-Javadoc)
         * @see org.hibernate.usertype.UserType#sqlTypes()
         */
        public int[] sqlTypes() { return SQL_TYPES ; }
     
        /*
         * (non-Javadoc)
         * @see org.hibernate.usertype.UserType#returnedClass()
         */
        public Class<?> returnedClass() { return EmbeddedCollection.class ; }
     
    …
     
    }
    la déclaration deviendrait alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    @Lob ou @Column(length="MAX_LENGTH_YOU_NEED")
    @Type(type="embeddedCollection")
    EmbeddedCollection addresses ;
    (@Lob + SQL_TYPES= { Types.VARCHAR } => vous aurez un CLOB, TEXT, … suivant le RDBMS…)
    [NB: correction… vous devriez avoir… même en mettant Types.CLOB, le DDL généré est VARCHAR(255)… -> passez par @Column(columnDefinition="TEXT") ou @Column(columnDefinition="CLOB") ou @Column(length=WHAT_YOU_NEED)]

    last but not least : dans package-info.java (1 exemplaire par package qui utilise EmbeddedCollection !!!!)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    @org.hibernate.annotations.TypeDefs({
        @org.hibernate.annotations.TypeDef(
                        name="embeddedCollection",
                        typeClass = PACKAGE_PATH.EmbeddedCollectionUserType.class
        )
    })
     
    package YOUR_PACKAGE_NAME ;
    Dans EmbeddedCollection, il faudra être capable de convertir la String en la Collection ce qui induit que la classe Adresse supporte un constructor Adresse(String) ou une factory Adresse.fromString(String) et que dans l'autre sens soit toString() soit une autre méthode renvoit la même String que celle que le constructor (ou la factory) attend…
    bref que vous ayez tous les outils pour sérialiser/désérialiser sous la main…
    (il ne sera pas inutile que votre format de sérialisation mémorise la classe des objets de la collection si vous voulez que EmbeddedCollection soit générique… )

    Cela étant dit, dans le cas d'un type Adresse et de ce que cela sous-entend au niveau "business" : ce n'est vraiment pas la solution la plus adéquate…
    Faire d'Adresse une @Entity reste la solution la plus classique…
    (mais le mécanisme du UserType reste intéressant à connaître évidemment)

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 36
    Par défaut
    Dans le cas d'un user type ou dans le cas d'un simple tableau de string (ce que j'utilise perso...)

    Est il possible de faire un requete en utilisant MEMBER OF comme ce que l'on fait avec une collection dans une autre table?

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 19
    Par défaut
    Super Post !!!!
    Merci pour toutes ces infos. Je fais mon test ASAP et je post le result.

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/08/2003, 18h04
  2. free sur des tableaux "a moitié dynamiques"
    Par barthelv dans le forum C
    Réponses: 4
    Dernier message: 31/07/2003, 15h30
  3. [langage] erreurs utilisation tableaux 2 dimensions
    Par drosof dans le forum Langage
    Réponses: 11
    Dernier message: 01/07/2003, 11h44
  4. Réponses: 6
    Dernier message: 04/04/2003, 15h28
  5. Les tableaux en PL/SQL
    Par GRUMLY dans le forum PL/SQL
    Réponses: 5
    Dernier message: 12/08/2002, 18h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo