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 :

FindByExample et OneToOne ne fonctionne pas


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Par défaut FindByExample et OneToOne ne fonctionne pas
    Bonjour,

    J'ai un soucis avec une classe annotée jpa. ( je débute ... )
    Environnement: Java6, JPA2 / Hibernate, Jboss. On part d'une base de donnée oracle10 existante.

    Mon entité principale contient 3 clés proventant de la DB et 2 entités liées à ces deux clés:
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    @Entity
    @Table(name="MATOS_USERDPT")
    public class MatosUserdpt implements Serializable {
    	private static final long serialVersionUID = 1L;
     
    	@Id
    	@Column(name="MU_ID")
    	private Long muId;
     
    	@Column(name="MU_LOCID")  // Lié à une autre table
    	private Long muLocid;
     
    	@Column(name="MU_USERID") // lié à une autre table
    	private Long muUserid;
     
    //  association Matos_loc
    	@OneToOne
    	@JoinColumn(name="MU_LOCID", referencedColumnName="ML_ID",insertable=false, updatable=false)
    	private MatosLoc matosloc;
     
    //  association PhilinkUser
    	@OneToOne
    	@JoinColumn(name="MU_USERID", referencedColumnName="PU_SERIAL",insertable=false, updatable=false)
    	private PhilinkUser philinkUser;
    ... Getters/Setters
    }
     
    @Entity
    @Table(name="MATOS_LOC")
    @SequenceGenerator(name="MATOSLOC_SEQ_GEN", sequenceName = "matosloc_seq")
    public class MatosLoc implements Serializable {
    	private static final long serialVersionUID = 1L;
     
    	@Id
    	@Column(name="ML_ID")
    	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "MATOSLOC_SEQ_GEN")
    	private long mlId;
     
             ... Getters/Setters
    }
     
    @Entity
    @Table(name="PHILINK_USER")
    public class PhilinkUser implements Serializable {
    	private static final long serialVersionUID = 1L;
     
    	...
    	@Id
    	@Column(name="PU_SERIAL")
    	private Long puSerial;
     
             ... Getters/Setters
    }
    Voici la méthode qui effectue la recherche
    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
    20
    21
     
    @Override
    	public List<E> findByExample(E exampleInstance, int startitem,
    			int maxitems, boolean ignoreCase) {
     
    		org.hibernate.Session hibernateSession = (Session) em.getDelegate();
     
    		Example expl = Example.create(exampleInstance).excludeZeroes();
    		if (ignoreCase)
    			expl.ignoreCase();
    		expl.enableLike(MatchMode.ANYWHERE);
     
    		Criteria criteria = hibernateSession.createCriteria(this.entityClass)
    				.add(expl);
    		if (startitem >= 0)
    			criteria.setFirstResult(startitem);
    		if (maxitems > 0)
    			criteria.setMaxResults(maxitems);
     
    		return criteria.list();
    	}
    Bon, Si je prends l'sql généré par Hibernate et que je l'exécute manuellement j'ai le résultat escompté ( pour rendre lisible j'ai remplacé this_.MU_ID as MU1_1733_2_, this_.MU .... par '*'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select * from ( 
    select '*'
    from MATOS_USERDPT this_ 
    left outer join MATOS_LOC matosloc2_ on this_.MU_LOCID=matosloc2_.ML_ID 
    left outer join PHILINK_USER philinkuse3_ on this_.MU_USERID=philinkuse3_.PU_SERIAL 
    where (this_.MU_USERID=2662) ) where rownum <= 100

    Avec le query exécuté manuellement, pour chaque objet 'MatosUserdpt' trouvé j'ai la bonne valeur dans 'muLocid' et donc l'objet 'matosloc' est correct également.
    Par contre la requete exécutée sur le serveur (méthode findByExample) me donne pour chaque objet 'MatosUserdpt' un 'muLocid' à 0 !!
    Je ne vois pas du tout d'où ça pourrait venir.

    Merci pour votre aide !

    Frédéric.

  2. #2
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Sans regarder plus, est-ce que peux essayer d'enlever ton setMaxResult. J'ai déjà eu des surprises avec les Criteria et l'endroit où il s'applique. Ça ne devrait pas s'appliquer sur une relation 1-1, mais ça semble mystérieux comme comportement.

  3. #3
    Membre Expert
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Par défaut
    Moi ce qui me semble curieux c'est ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @Column(name="MU_LOCID")  // Lié à une autre table
    	private Long muLocid;
     
    	@Column(name="MU_USERID") // lié à une autre table
    	private Long muUserid;
    A quoi te servent les ids en dehors de l'association (OneToOne) ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Par défaut
    bonjour et merci pour vos réponses !

    Rei Ichido, j'ai essayé de supprimer les min et max , mais sans succes

    Patriarch24, Effectivement, ces ids n'ont pas d'utilité en soi. Je réécrit ma classe sans ses ids, mais pas d'amélioration. Je suis en train de creuser du côté de hibernate/findByExample. Je pense que c'est là que se trouve la solution. Si je ne me trompe pas il n'est pas possible d'effectuer un findByExample grâce à JPA. Je dois donc passer par une syntaxe pure Hibernate. Je creuse de ce côté là, et je reviens plus tard avec une solution .. ou pas.

    Bon week-end

    Fred.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Par défaut resolu]
    Avec un peu de retard, voici la cause de mon soucis:

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Par défaut
    Avec un peu de retard, voici la cause de mon soucis:

    Tout simplement, l'id @Id utilisé dans la table MatosUserDpt n'est pas unique. Du coup si mon query doit me renvoyer 4 enregistrements, il me donne 4x le même objet.

    Merci pour l'aide !

    Et Boooooooooonne Année 2011 !

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/01/2004, 11h14
  2. [FP]Writeln ne fonctionne pas !
    Par néo333 dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 01/11/2003, 23h47
  3. UNION qui ne fonctionne pas
    Par r-zo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/07/2003, 10h04
  4. Un Hint sur un PopupMenu ne fonctionne pas !!??
    Par momox dans le forum C++Builder
    Réponses: 6
    Dernier message: 26/05/2003, 16h48
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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