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 :

Champ transient qui ne s'affiche pas


Sujet :

JPA Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 55
    Points : 30
    Points
    30
    Par défaut Champ transient qui ne s'affiche pas
    Bonjour à tous !

    je suis sur un projet d'application web java et j'ai opté pour JPA pour la persistance des données.
    Malheureusement j'ai un souci pour afficher un champ annoté avec @transient (pour qu’il soit ignoré lors de la persistance de l'entité) dans mon dataTable.
    En fait la colonne correspondante est vide si le champ est annoté avec @transient et sans annotation elle est bien remplie !
    je cherche le pourquoi mais j'arrive toujours pas à comprendre.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    si le champ est vide c'est que tu ne lui a pas donné de valeur après avoir chargé tes données. Aussi, si tu récupère tes données à travers un ejb, les champs transient peuvent devenir vide lors du transfert des object de et vers l'EJB.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juillet 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 55
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    si le champ est vide c'est que tu ne lui a pas donné de valeur après avoir chargé tes données. Aussi, si tu récupère tes données à travers un ejb, les champs transient peuvent devenir vide lors du transfert des object de et vers l'EJB.
    merci tchize pour votre réponse; mais je ne comprends pas quand vous dites 'donné de la valeur après avoir chargé tes données' comment s'y prendre concrètement ?

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    un champ transient n'est ni sérialisé, ni stocké dans la base de données. Donc sa valeur est vide si tu ne met pas explicitement une valeur dedans après l'avoir récupéré de la base de données. donc la question est comment tu remplis cette donnée avant d'envoyer tes objets vers ta dataTable?

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juillet 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 55
    Points : 30
    Points
    30
    Par défaut
    OK , je vois
    en fait ce que j'ai fait c'est ça

    mon dataTable est alimenté par ma liste suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public List<Fournisseurs> getListFournisseurs() {
     
            List<Fournisseurs> listFrs =  em.createNamedQuery("getAllFournisseurs", Fournisseurs.class).getResultList();
     
            return listFrs;
        }
    et la colonne concernée est renseignée comme telle



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <p:dataTable value="#{fournisseursFacade.listFournisseurs}" var="item"....
     
    <p:column style="width: 20%" filterBy="#{item.intitule}">
                                <f:facet name="header">
                                    <h:outputText value="Spécialité"/>
                                </f:facet>
     
                                <h:outputText value="#{item.intitule}"/>
                         </p:column>
    Avec l'annotation @transient sur le champ "intitule" la colonne est vide !

    je précise que le champ "intitule" n'existe pas dans ma table "fournisseur" mais provient de la jointure avec une autre table "specialité" , je l'ai juste ajouté à mon bean entité en plus des champs correspondants
    aux colonnes de ma table. Est - ce même possible d'ajouter un champ qui ne figure pas dans la table ?

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    tu peux créer des propriété dérivées oui. Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Fournisseur{
    //....
     
       @Transient
       public String getIntitule(){
          return getSpecialite().getTitre();
       }
    }
    par contre en l'occurence on ne vois pas trop dans ce cas présent l'intérêt d'aller encombrer ton bean avec des propriété qui viennent d'un autre bean alors que jsf est capable d'aller chercher tout ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <p:dataTable value="#{fournisseursFacade.listFournisseurs}" var="item"....
     
    <p:column style="width: 20%" filterBy="#{item.intitule}">
                                <f:facet name="header">
                                    <h:outputText value="Spécialité"/>
                                </f:facet>
     
                                <h:outputText value="#{item.specialite.titre}"/>
                         </p:column>

  7. #7
    Nouveau membre du Club
    Inscrit en
    Juillet 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 55
    Points : 30
    Points
    30
    Par défaut
    Merci mille fois tchize !

    Mon problème est résolu dans ce cas ci, seulement il s'agit maintenant d'un champ calculé (par exemple âge), j'ai le même souci
    pour la récupération car

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <p:column style="width: 4%; text-align: center"
                                              filterBy="#{item.agepart}"
                                              filterMatchMode="exact"
                                              filterStyle="width:20px; text-align: center"
                                              filterMaxLength="2">
                                        <f:facet name="header">
                                            <h:outputText value="Age"/>
                                        </f:facet>
                                        <h:outputText value="#{item.participantFacade.agepart}"/>
                </p:column>
    ne marche pas puisque agepart n'existe pas dans la table participant; il est retourné par une requête sql via une fonction

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    tu peux montrer ta classe?

  9. #9
    Nouveau membre du Club
    Inscrit en
    Juillet 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 55
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    tu peux montrer ta 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
    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    @Entity
    @Table(name = "participants")
    @XmlRootElement
     
    @NamedNativeQueries({
        @NamedNativeQuery(name = "getAllParticipants", query = "SELECT codesoc,numcont, matricule, prenom, nom, sexe, datenaiss, nbenfant, nbfemme, " 
    				+" date_part('year', age(CURRENT_DATE,dateemb)) as anc, adresse, " 
    					+" date_part('year', age(CURRENT_DATE,datenaiss)) as agepart, dateemb,"
    					+" date_part('year', age(annee_retraite(datenaiss), CURRENT_DATE)) AS anrest,"
    					+" typecontrat, categprof"
    					+" FROM participants "					
    					+" ORDER BY matricule", resultClass = Participants.class)}
     
    )
    public class Participants implements Serializable {
     
        private static final long serialVersionUID = 1L;
        @Basic(optional = false)
        @NotNull
        @Size(min = 1, max = 10)
        @Column(name = "matricule")
        private String matricule;
        @Basic(optional = false)
        @NotNull
        @Size(min = 1, max = 20)
        @Column(name = "matipm")
        private String matipm;
        @Size(max = 30)
        @Column(name = "nom")
        private String nom;
        @Size(max = 50)
        @Column(name = "prenom")
        private String prenom;
        @Size(max = 2)
        @Column(name = "sexe")
        private String sexe;
        @Size(max = 20)
        @Column(name = "sitfam")
        private String sitfam;
        @Column(name = "datenaiss")
        @Temporal(TemporalType.DATE)
        private Date datenaiss;
        @Size(max = 60)
        @Column(name = "lieunaiss")
        private String lieunaiss;
        @Size(max = 25)
        @Column(name = "region")
        private String region;
        @Size(max = 30)
        @Column(name = "pays")
        private String pays;
        @Size(max = 100)
        @Column(name = "adresse")
        private String adresse;
        @Size(max = 20)
        @Column(name = "portable")
        private String portable;
        // @Pattern(regexp="[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", message="Invalid email")//if the field contains email address consider using this annotation to enforce field validation
        @Size(max = 100)
        @Column(name = "email")
        private String email;
        @Column(name = "dateemb")
        @Temporal(TemporalType.DATE)
        private Date dateemb;
        @Id
        @Basic(optional = false)
        @NotNull
        @Size(min = 1, max = 15)
        @Column(name = "numcont")
        private String numcont;
        @Size(max = 2)
        @Column(name = "etatcont")
        private String etatcont;
        @Column(name = "datesous")
        @Temporal(TemporalType.TIMESTAMP)
        private Date datesous;
        @Column(name = "dateres")
        @Temporal(TemporalType.DATE)
        private Date dateres;
        @Size(max = 2)
        @Column(name = "codesoc")
        private String codesoc;
        @Size(max = 5)
        @Column(name = "compte")
        private String compte;
        @Column(name = "numfiche")
        private Integer numfiche;
        @Column(name = "datedebcarte")
        @Temporal(TemporalType.TIMESTAMP)
        private Date datedebcarte;
        @Column(name = "datefincarte")
        @Temporal(TemporalType.DATE)
        private Date datefincarte;
        @Column(name = "nbfemme")
        private Short nbfemme;
        @Column(name = "nbenfant")
        private Short nbenfant;
        @Column(name = "dateradiation")
        @Temporal(TemporalType.DATE)
        private Date dateradiation;
        @Size(max = 20)
        @Column(name = "cin")
        private String cin;
        @Column(name = "typecontrat")
        private Character typecontrat;
        @Size(max = 20)
        @Column(name = "categprof")
        private String categprof;
        @Column(name = "ajout")
        private Character ajout;
        @Column(name = "datecreationpart")
        @Temporal(TemporalType.TIMESTAMP)
        private Date datecreationpart;
        @Size(max = 30)
        @Column(name = "photo")
        private String photo;
        @Size(max = 2)
        @Column(name = "indic")
        private String indic;
        @JoinColumn(name = "codeaffect", referencedColumnName = "codeaffect")
        @ManyToOne
        private Affectations codeaffect;
        @JoinColumn(name = "codeserv", referencedColumnName = "codeserv")
        @ManyToOne
        private Services codeserv;
     
        private int agepart = 0;
        private int anc = 0;
        private int anrest = 0;
     
        public Participants() {
        }
    getters/setters ...

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Je ne vois rien de transient dans ta classe.

    Aussi, tu devrais plutôt calculer ces champs dérivés dans ce cas-ci directement depuis la classe voir au niveau des classes qui l'utilisent, plutôt que de faire ce genre de chose compliquée depuis sql. Ca n'a que peu d'intérêt de splitter dans ton entité une date en année de retraite et age, c'est le boulot de la partie business, pas data.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Participant {
     
     
      private Date dateNaissance;
      @Transient
      public int getAge(){
        Period.between(
          dateNaissance.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(), 
          LocalDate.now()
        ).getYears();
      }
    }

  11. #11
    Nouveau membre du Club
    Inscrit en
    Juillet 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 55
    Points : 30
    Points
    30
    Par défaut
    Oui c'est vrai ! je l'avais enlever juste avant de poster la classe,
    mais ça concernait les derniers champs dérivés (agepart, anrest et anc)
    je vais creuser dans le sens de votre réponse après je vous reviens

    Merci beaucoup

Discussions similaires

  1. [XL-2013] Power Pivot : Total champs calculés qui ne s'affichent pas.
    Par Mathsdeb dans le forum Excel
    Réponses: 0
    Dernier message: 31/05/2016, 19h40
  2. champ auto d'interbase qui ne s'affiche pas
    Par ally dans le forum Bases de données
    Réponses: 2
    Dernier message: 28/04/2007, 20h03
  3. Champ auto qui ne s'affiche pas
    Par codial dans le forum Connexion aux bases de données
    Réponses: 19
    Dernier message: 27/11/2006, 17h26
  4. Champs qui ne s'affichent pas dans formulaire
    Par capitaine dans le forum Access
    Réponses: 1
    Dernier message: 02/06/2006, 15h00
  5. Réponses: 5
    Dernier message: 23/01/2006, 12h31

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