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 :

[JPA 2 / Hibernate 4.1.5] Clé composite comportant des valeurs nulles


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Par défaut [JPA 2 / Hibernate 4.1.5] Clé composite comportant des valeurs nulles
    Bonjour,

    J'utilise JPA avec Hibernate comme implémentation dans un projet.
    J'ai une table dans la base de données qui ne comporte pas de clé primaire (hé oui, la classe ). Il y a même des lignes en doublons que je supprime avant d'effectuer mes traitements.

    J'ai mappé cette table avec JPA (annotations) sans fichier persistence.xml en utilisant les classes (context.xml) de spring.

    Ca fonctionne plutot bien. Mais le soucis est que j'ai créé une clé composite (@Embeddable) pour cette table qui représente les champs pour lesquels on ne devrait pas retrouver de doublons (c'est une clé fonctionnelle).
    Sauf que dans cette clé composite, il y a parfois dans la base de données des valeurs nulles.

    Exemple :

    Entité -> MaTable
    Clé composite :
    - Int monEntier
    - String monString

    Quand j'exécute mes traitements en test U. sur hsqldb, cela fonctionne parfaitement parce que je crée mes tables à chaque exécution des tests. Par contre, quand je les exécute directement sur ma base de tests, j'ai une exception parce que le champ "monString" est parfois null.

    Savez-vous comment pourrais-je remédier à ce problème ?
    J'ai essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @Column([...], nullable=true)
    et/ou en mettant dans le get

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(monString == null) { return ""; }
    mais j'ai quand même une exception.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [...]monString cannot be null [...]
    Merci.
    Faites une recherche sur le forum et/ou sur internet et lisez la doc officielle avant de poser une question svp.
    et n'oubliez pas de lire les FAQ !
    FAQ Java et les cours et tutoriels Java
    Doc JAVA officielle
    AngularJS 1.x
    Angular 2

    Do it simple... and RTFM !

  2. #2
    Membre émérite Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Par défaut
    Bonjour,

    Bon... j'ai essayé d'utiliser l'annotation @SqlResultSetMapping en ajoutant toutes les propriétés avec leur nom et le nom de la colonne dans la base de données... (Oracle 10g) et le paramètre resultSetMapping dans la méthode createNativeQuery de ma DAO.

    J'ai une exception qui me dit que le nom d'une propriété est invalide (invalid column name).

    Dans le mapping de mon entité, quand je détaille toutes les propriétés avec @FieldResult (en précisant le nom de la propriété et le nom de la colonne dans la BD), j'ai un 'invalid column name'. Et quand je laisse que @EntityResult avec la classe qui est retournée par la méthode du DAO (classe résultat), j'ai un numeric overflow (dans l'entité, j'ai des Integer et des Long, correspondant au type NUMBER d'Oracle).

    Après vérification, tout a l'air normal. J'ai bien les bons types pour toutes les propriétés.

    J'ai cherché ensuite sur internet, ils disent que c'est un bug... et qu'il faut utiliser EclipseLink (je ne peux pas...)

    Autre Solution que j'ai essayé :
    j'ai créé des UserType (Long, String, Date et Integer) que j'ai mis sur toutes les propriétés de ma clé composite.
    Et là, une exception qui me dit que le type ne peut pas être mappé (quand la valeur est nulle).

    Ils n'ont vraiment pas prévu ce cas ? c'est fou...

    Vous n'avez pas une idée ?
    Merci.
    Faites une recherche sur le forum et/ou sur internet et lisez la doc officielle avant de poser une question svp.
    et n'oubliez pas de lire les FAQ !
    FAQ Java et les cours et tutoriels Java
    Doc JAVA officielle
    AngularJS 1.x
    Angular 2

    Do it simple... and RTFM !

  3. #3
    Membre émérite Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Par défaut
    Bonjour,

    Je vais faire ce que je voulais éviter.
    J'ai 86 attributs dans la table...
    et une vingtaine dans ma clé composite (bonjour les perfs oui )

    Jusque là, j'utilisais du jpql mais je vais passer au NativeQuery avec tous les attributs dans le select avec un nvl (fonction Oracle permettant de vérifier la nullité). Ca fera une jolie requête.

    Merci quand même.
    Faites une recherche sur le forum et/ou sur internet et lisez la doc officielle avant de poser une question svp.
    et n'oubliez pas de lire les FAQ !
    FAQ Java et les cours et tutoriels Java
    Doc JAVA officielle
    AngularJS 1.x
    Angular 2

    Do it simple... and RTFM !

  4. #4
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 1
    Par défaut [JPA 2 / Hibernate 4.1.5] Clé composite comportant des valeurs nulles
    Bonjour,

    J'ai le même problème que toi, aurais tu trouvé une solution?
    Sinon j'utilise Criteria et je n'arrive pas introduire la fonction NVL(ou COALESCE) dedans, si tu utilise Criteria pourrai tu m'expliquer comment introduire cette fonction?

    Cordialement

  5. #5
    Membre émérite Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Par défaut
    Salut,

    Je n'ai pas utilisé de Criteria... Désolé. Et je pense que c'est impossible d'utiliser les nvl avec les Criteria...

    J'utilisais des @NamedQuery.
    Mais là, pour utiliser la fonction nvl, j'ai dû supprimer ces NamedQuery et créer un hbm où j'ai mis mes requêtes SQL avec les fonctions nvl.
    (mais ça, ça ne dépendait pas de la technique. C'etait pour les analystes qui voulais avoir les requetes dans un XML). Je pense qu'on peut les garder comme annotation même si on utilise des requêtes SQL natives.

    Dans mes Dao, j'utilise la méthode getNamedQuery de la session hibernate.
    Faites une recherche sur le forum et/ou sur internet et lisez la doc officielle avant de poser une question svp.
    et n'oubliez pas de lire les FAQ !
    FAQ Java et les cours et tutoriels Java
    Doc JAVA officielle
    AngularJS 1.x
    Angular 2

    Do it simple... and RTFM !

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

Discussions similaires

  1. Jpa et Hibernate avec oracle : Same name ?
    Par rimas2009 dans le forum JPA
    Réponses: 1
    Dernier message: 12/05/2010, 15h32
  2. relation entre JPA et Hibernate
    Par sakli dans le forum JPA
    Réponses: 18
    Dernier message: 09/11/2009, 09h40
  3. Réponses: 2
    Dernier message: 25/08/2009, 16h30
  4. Réponses: 0
    Dernier message: 03/12/2008, 10h49
  5. spring test with jpa-mysql-hibernate.
    Par kossistus dans le forum Spring
    Réponses: 1
    Dernier message: 09/05/2008, 00h28

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