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

JSF Java Discussion :

Créer et persister une entitée avec relation @ManyToOne


Sujet :

JSF Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Par défaut Créer et persister une entitée avec relation @ManyToOne
    Bonjour,

    Je cherche surtout une bonne pratique concernant la création + persistence d'une entité.

    Voila, j'ai une classe @Entity Affaire avec ses propriétés et ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @JoinColumn(name = "IDCONTACT", referencedColumnName = "IDCONTACT")
        @ManyToOne
        private Contact contact;
        @JoinColumn(name = "IDCLIENT", referencedColumnName = "IDCLIENT", nullable=false)
        @ManyToOne
        private Client client;
        @JoinColumn(name = "IDCHARGEAFFAIRE", referencedColumnName = "IDCHARGEAFFAIRE")
        @ManyToOne
        private ChargeAffaire chargeAffaire;
    Bien entendu les classes Client, ChargeAffaire et Contact font référence à Affaire

    Maintenant dans la page JSF pour la création d'une affaire j'ai des h:selectOneListbox qui obtiennent leurs f:selectItems de différents managed bean (ClientCtrlBean, ChargeAffaireCtrlBean).

    J'espère être clair jusque là.

    Donc sur ma page JSF lorsque je selectionne une valeur dans un de mes combobox, il me renvoie un (int, long,...), et pas l'objet en question.

    Ce qui fait que dans mon managed-bean AffaireCtrlBean, je dois faire des findBy(idClient) pour re-récupérer le client sélectionné.
    Je trouve cela un peu tordu, et peu performant.
    N'est-il pas possible de récupérer LE client selectionné directement du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <h:outputText value="#{bundle.nomClient} :"/>
    <h:selectOneListbox value="#{affaireCtrlBean.affaire.client}" size="1">
            <f:selectItems value="#{clientCtrlBean.selectItemClientsAll}" />
    </h:selectOneListbox>
    Comment faites-vous pour améliorer ce processus?

    Merci, et j'espère avoir été assez clair.

  2. #2
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Si tu veux récupérer l'objet, tu dois utiliser un converter;

    tu trouvera dans la faq des exemples.

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 68
    Par défaut
    tu veux diminuer les allés retour à la base de données pour un souci de performance, tu peux récupérer la liste de tous les clients, ensuite quand tu sélectionnes un client tu boucle sur ta liste pour le récupérer. Tu gagnes en performances.

  4. #4
    Membre éclairé Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Par défaut
    Merci pour les conseils.

    J'ai donc essayé de faire des converters mais je me récupère le message "Erreur de validation: Valeur not valid."

    A ce que j'ai lu c'est que le type envoyé ne correspond pas au type attendu pourtant je l'ai défini dans le face-config comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <converter>
           <converter-for-class>com.enregistrementAffaires.entites.Client</converter-for-class>
           <converter-class>com.enregistrementAffaires.jsfConverter.ClientConverter</converter-class>
       </converter>
    la méthode getAsObject est bien effectuée puisque j'atteinds le return c avec la valeur sélectionnée:
    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
     
     public Object getAsObject(FacesContext context, UIComponent component, String value) {
     
            if (value == null || value.length() == 0) {
                return null;
            }
            Integer id = new Integer(value);
            ClientControleur clientController = (ClientControleur) context.getApplication().getELResolver().getValue(context.getELContext(), null, "clientMB");
            List<Client> clients= clientController.getClients();
            for(Client c:clients){
                if(c.getId().equals(id)){
                    return c;
                }
            }
            return null; //TODO: lève une exception plutôt
        }
    Voila comment je l'appelle depuis ma jsp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <h:outputText value="#{bundle.nomClient} :"/>
    <h:selectOneListbox value="#{affaireMB.aff.client}" size="1">
           <f:selectItems value="#{clientMB.selectItemClientsAll}"/>
     </h:selectOneListbox>
    Je ne saisis pas pourquoi j'obtiens cette erreur vu que le converter est appliquable à la classe Client et renvoie une instance de Client. Cela serait-il dû au selectItems??

    Encore merci pour le liens vers la FAQ. Quelqu'un peut m'éclairer la dessus?

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Par défaut
    Tu veux un id dans ton converter donc tu dois avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <h:selectOneListbox value="#{affaireMB.aff.client.id}" size="1">
           <f:selectItems value="#{clientMB.selectItemClientsAll}"/>
    </h:selectOneListbox>

  6. #6
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    dans getAsObject, la valeur est l'objet Client pas seulement l'id. tu dois passer une valeur de type Client à ton selectOneMenu et dans les selectItems;
    et N'oublie pas d'implémenter getAsString.

    Mais tu peux le faire également lors de la sélection, parcourir la liste et trouver l'objet sélectionné faire un appel à la base.

Discussions similaires

  1. Persistence d'une classe avec mapping ManyToOne
    Par yo_haha dans le forum JPA
    Réponses: 1
    Dernier message: 21/11/2013, 14h13
  2. Réponses: 1
    Dernier message: 22/05/2013, 15h01
  3. [2.x] [Formulaire] Créer une entité avec une relation ManyToMany
    Par SalutAVous dans le forum Symfony
    Réponses: 3
    Dernier message: 30/10/2012, 22h13
  4. Une entité avec plusieurs relations oneToOne
    Par ray-k dans le forum Doctrine2
    Réponses: 5
    Dernier message: 03/08/2012, 15h55
  5. [Hibernate] Faire une requête avec relation NN
    Par n@n¤u dans le forum Hibernate
    Réponses: 20
    Dernier message: 25/07/2006, 10h39

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