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 :

EJB Entity : mapping O/R de String


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de fatypunk
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 71
    Par défaut EJB Entity : mapping O/R de String
    Bonjour,

    J'ai une question qui me parait bête mais je ne trouve pas de réponse...

    En base de donnée, un varchar2 doit toujours être initialisé avec sa taille maximale alors qu'un String en java n'en a pas (dans les fait elle en a une mais il est inutile d'en tenir compte dans 99.999999999% des cas...).

    Donc comment garantir l'intégrité des données. Si je propose un TextField pour modifier une chaine dans l'UI j'aimerais bien empêcher l'utilisateur de rentrer plus de caractère que mon unité de persistance ne peut en stocker réellement (donc la DB qui est derrière). Mais au niveau du code java l'Entity ne me renvoie qu'un String... je n'ai pas cette information. Je pourrais stocker pour chaque champs la longueur max dans les paramètre des champs (je stocke de toute façon des paramètres liés aux champs, comme le format d'affichage, le nom du label par langue, ...), mais je n'aurais rien qui me garanti que ce paramètre est inférieur ou égal à la taille du varchar2 en DB... (pas de liaison).

    Le seul moyen de contrôle que je vois c'est d'interroger la DB mais c'est éthiquement inacceptable car tout l'intérêt de l'unité de Persistance disparait puisqu'on se retrouve avec un code lié à la DB...

  2. #2
    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 fatypunk Voir le message
    Bonjour,

    J'ai une question qui me parait bête mais je ne trouve pas de réponse...

    En base de donnée, un varchar2 doit toujours être initialisé avec sa taille maximale alors qu'un String en java n'en a pas (dans les fait elle en a une mais il est inutile d'en tenir compte dans 99.999999999% des cas...).

    Donc comment garantir l'intégrité des données. Si je propose un TextField pour modifier une chaine dans l'UI j'aimerais bien empêcher l'utilisateur de rentrer plus de caractère que mon unité de persistance ne peut en stocker réellement (donc la DB qui est derrière). Mais au niveau du code java l'Entity ne me renvoie qu'un String... je n'ai pas cette information. Je pourrais stocker pour chaque champs la longueur max dans les paramètre des champs (je stocke de toute façon des paramètres liés aux champs, comme le format d'affichage, le nom du label par langue, ...), mais je n'aurais rien qui me garanti que ce paramètre est inférieur ou égal à la taille du varchar2 en DB... (pas de liaison).

    Le seul moyen de contrôle que je vois c'est d'interroger la DB mais c'est éthiquement inacceptable car tout l'intérêt de l'unité de Persistance disparait puisqu'on se retrouve avec un code lié à la DB...
    API Reflection

    import java.lang.reflect.Field;
    import java.lang.reflect.Method;

    class.getDeclaredField vous donne le Field
    if (field.getType().equals(String.class)) {
    field.getAnnotation(Column.class) vous donne l'annotation @Column

    columnAnnotation.length() vous donne la longueur du champ string

    }

    (et tenez aussi compte de :
    Lob lob = field.getAnnotation(Lob.class) ;
    si c'est un champ String et qu'il est annoté avec @Lob la longueur n'est pas "définie" … == un TEXT ou un CLOB en RDMBS…)

  3. #3
    Membre éclairé Avatar de fatypunk
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 71
    Par défaut
    Citation Envoyé par JeitEmgie Voir le message
    API Reflection

    import java.lang.reflect.Field;
    import java.lang.reflect.Method;

    class.getDeclaredField vous donne le Field
    if (field.getType().equals(String.class)) {
    field.getAnnotation(Column.class) vous donne l'annotation @Column

    columnAnnotation.length() vous donne la longueur du champ string

    }

    (et tenez aussi compte de :
    Lob lob = field.getAnnotation(Lob.class) ;
    si c'est un champ String et qu'il est annoté avec @Lob la longueur n'est pas "définie" … == un TEXT ou un CLOB en RDMBS…)
    Très intéressant merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [EJB3 Entity] Principe du mapping O/R avec EJB entity
    Par Hello_World dans le forum Java EE
    Réponses: 4
    Dernier message: 15/08/2010, 22h43
  2. EJB Entity Bean et problème de mapping
    Par bard123 dans le forum JPA
    Réponses: 13
    Dernier message: 07/03/2008, 08h54
  3. [EJB3 Entity] Partage d'ejb entity entres applications, named queries
    Par kristof_machin dans le forum Java EE
    Réponses: 3
    Dernier message: 22/01/2008, 11h04
  4. [EJB3] EJB entity 3 et Hibernate 3
    Par pbdlpc dans le forum JPA
    Réponses: 3
    Dernier message: 05/12/2006, 14h14
  5. [EJB] Généralités sur les EJB Entity
    Par drKzs dans le forum Java EE
    Réponses: 2
    Dernier message: 07/04/2006, 12h15

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