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 :

Participez à la création de la FAQ JPA


Sujet :

JPA Java

  1. #1
    Responsable Java & Kotlin

    Avatar de Mickael Baron
    Homme Profil pro
    Ingénieur de Recherche en Informatique
    Inscrit en
    juillet 2005
    Messages
    14 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche en Informatique
    Secteur : Service public

    Informations forums :
    Inscription : juillet 2005
    Messages : 14 832
    Points : 72 442
    Points
    72 442
    Par défaut Participez à la création de la FAQ JPA
    Bonjour,

    Ce sujet sert à recenser les sujets récurrents du forum JPA destinés à alimenter la future FAQ JPA.

    Vous pouvez poster à la suite les liens vers les sujets en question et si possible formaliser la Q/R à la suite. Lorsque nous aurons une quantité suffisante de Q/R nous essaierons d'en dégager une classification.

    Vous pouvez également poster librement vos propositions de Q/R.

    Attention à ne pas s'éloigner du cadre de JPA en débordant sur la FAQ Hibernate.

    à tous
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Ingénieur de Recherche en informatique au LIAS / ISAE-ENSMA
    Page de Developpez.com : mbaron.developpez.com
    Twitter : www.twitter.com/mickaelbaron
    Blog : mickael-baron.fr
    LinkedIn : www.linkedin.com/in/mickaelbaron
    DBLP : dblp.uni-trier.de/pers/hd/b/Baron:Micka=euml=l

  2. #2
    Membre régulier Avatar de fisico
    Profil pro
    Inscrit en
    septembre 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : septembre 2003
    Messages : 98
    Points : 92
    Points
    92
    Par défaut
    Question:
    Comment transformer un POJO en entité?

    Réponse:
    Deux solutions sont possibles:
    • Ajouter l'annotation @Entity au niveau de la classe
    • Déclare l'entité dans le fichier orm.xml
    SCJP - SCWCD - SCBCD

  3. #3
    Membre habitué
    Inscrit en
    mars 2007
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : mars 2007
    Messages : 135
    Points : 146
    Points
    146
    Par défaut Un equestion simple
    Comment limiter le nombre d'objets renvoyés par une requête JPQL (Par exemple gestion de la pagination) ?

    Solution:

    Query q = ...
    q.setFirstResult(<rowid de départ>);
    q.setMaxresult(<nombre de lignes lues>);

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    novembre 2006
    Messages
    7 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : novembre 2006
    Messages : 7 183
    Points : 9 306
    Points
    9 306
    Billets dans le blog
    1
    Par défaut
    Comment créer une propriété dans un Entity non liée à un champ de la table cible :

    - Utiliser l'annotation @Transient
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    novembre 2006
    Messages
    7 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : novembre 2006
    Messages : 7 183
    Points : 9 306
    Points
    9 306
    Billets dans le blog
    1
    Par défaut
    Avec Hibernate (il semblerait que ça ne concerne que lui), comment créer une jonction en EJBQL entre 2 tables sans mapping dans l'Entity :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select a.uid, a.nom, b.texte from table1 a, table2 b
    where a.uid=b.uid
    la version suivante ne fonctionnant pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select a.uid, a.nom, b.texte from table1 a join table2 b on a.uid=b.uid
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Invité(e)
    Invité(e)
    Par défaut
    Comment créer une requête:

    deux solutions:


    Solution 1:

    soit dans l'Entity:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    @NamedQueries({
    	@NamedQuery(name = "nomDeLaRequete1",       query = "select unChamp from monEntity where nom = ?1"),
    	@NamedQuery(name = "nomDeLaRequete2",    query = "select unChamp from monEntity where prenom = ?1"),
    	@NamedQuery(name = "nomDeLaRequeteX",      query = "select unChamp from monEntity where date = ?1")
    })
    puis dans le manager faire comme suit:

    si la requête retourne un ensemble de lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Query query = entityManager.createNamedQuery("nomDeLaRequete1");
    query.setParameter(1, nom );
    List liste = query.getResultList();
    si la requête retourne une seule ligne..un total par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Query query = entityManager.createNamedQuery("nomDeLaRequete1");
    query.setParameter(1, nom );
    TypeDuChamp monChamp = query.getSingleResult();
    Solution 2:

    on créé la requête directement dans le manager:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Query oQuery = entityManager.createQuery("select monChamp from monEntity");
    List liste =  = oQuery.getResultList();
    ou
    TypeDuChamp monChamp = oQuery.getSingleResult();
    NB: j'ai du mal à distinguer la limite EJB3 / JPA donc supprimez au besoin

  7. #7
    Invité(e)
    Invité(e)
    Par défaut
    Comment faire un update:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    entityManager.find(MonEntity.class, PK).setLeChamp(nouvelleValeurDeMonChamp);
    setLeChamp() étant bien sur un setter associé au champ en question défini dans MonEntity
    et
    PK la clé primaire de MonEntity

  8. #8
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    novembre 2006
    Messages
    7 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : novembre 2006
    Messages : 7 183
    Points : 9 306
    Points
    9 306
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par amazoone Voir le message
    Comment faire un update:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    entityManager.find(MonEntity.class, PK).setLeChamp(nouvelleValeurDeMonChamp);
    setLeChamp() étant bien sur un setter associé au champ en question défini dans MonEntity
    et
    PK la clé primaire de MonEntity
    Ce serait plutôt :
    Comment faire un update d'un seul champ

    pour moi, la méthode usuelle serait plutôt
    1) JTA (les transactions seront gérées par annotations)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    em.merge(monEntity);
    ou
    em.persist(monEntity);
    2) Non JTA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    EntityTransaction tx = em.getTransaction();
    tx.begin();
     
    em.merge(monEntity);
    ou
    em.persist(monEntity);
     
    tx.commit();
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre régulier
    Développeur informatique
    Inscrit en
    août 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : août 2007
    Messages : 118
    Points : 84
    Points
    84
    Par défaut Accès par champ ou par propriété?!
    JPA permet deux types de liens entre les colonnes d'une base de données et les éléments d'une classe :

    1: Liens par champ :
    Les colonnes d'une table de la base de données correspondent aux champs de la classe.

    2: Liens par propriétés :
    Les colonnes d'une table de la base de données correspondent aux getters de la classe.

    Pour choisir l'un ou l'autre, il suffit de mettre l'annotation @Id sur le champ ou bien sur le getter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    1 : 
    @Id
    private int id;
     
    2:
    @Id
    public int getId();
    Le choix de "Liens par propriétés" oblige l'ajout de getters pour tous les champs même si parfois en ne s'en sert absolument pas.
    SJCP 1.6

  10. #10
    En attente de confirmation mail

    Homme Profil pro
    Inscrit en
    juillet 2006
    Messages
    766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : juillet 2006
    Messages : 766
    Points : 1 222
    Points
    1 222
    Par défaut
    Je pense que ce serait bien, à chaque fois, d'encadrer les solutions par tx.begin(); et tx.commit(); si il y a lieu.


    Comment faire un CRUD :

    Create :

    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
    try {
                EntityManager em = Persistence.createEntityManagerFactory("myPersistenceUnit").createEntityManager();
                EntityTransaction tx = em.getTransaction();
                tx.begin();
                
                c = new SclClasse();
                c.setName(name);
                c.setNumber(number);
    
                em.persist(c);
                tx.commit();
                em.close();
    
            } catch (RuntimeException ex) {
                MyLog.sendLog(ex, "JPA Exception" + ex.getMessage());
                throw new JPAException(ex.getMessage());
            }
    UPDATE : déjà vu
    RETRIEVE :

    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
    public Classe retrieve(int idClasse) throws JPAException, NotFoundException {
            SclClasse c;
            try {
    
               EntityManager em = Persistence.createEntityManagerFactory("myPersistenceUnit").createEntityManager();
                EntityTransaction tx = em.getTransaction();
                tx.begin();
    
                c = em.find(SclClasse.class, idClasse);
                
                tx.commit();
                em.close();
    
            } catch (RuntimeException ex) {
                MyLog.sendLog(ex, "JPA Exception :" + ex.getMessage());
                throw new JPAException(ex.getMessage());
            }
    
            if (c == null) {
                throw new NotFoundException("classe :" + idClasse + " not found");
            }
    
            return c;
    
        }
    Pour le code ci-dessus, je ne susi pas sûr de moi sur toute les conséquences du management d'Entity - cf mon post. Mais le code est à mon avis suffisant.

    DELETE :
    Pas sûr de moi

    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
     void deleteClasse(int idClasse) throws JPAException{
            try {
                EntityManager em = Persistence.createEntityManagerFactory("myPersistenceUnit").createEntityManager();
                EntityTransaction tx = em.getTransaction();
                tx.begin();
                
                SclClasse c = em.find(SclClasse.class, idClasse);
                em.remove(c);
    
                tx.commit();
                em.close();
    
            } catch (RuntimeException ex) {
                MyLog.sendLog(ex, "JPA Exception" + ex.getMessage());
                throw new JPAException(ex.getMessage());
            }
    
        }

  11. #11
    Membre confirmé
    Avatar de mhamedbj
    Profil pro
    Inscrit en
    février 2007
    Messages
    403
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 403
    Points : 554
    Points
    554
    Par défaut Comment faire un delete en cascade (Version simple)
    Bonjour,

    supposant deux entité parent et fils :

    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
    @Entity
    @Table(name="Parent", schema="")
    public class Parent implements Serializable {
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private int id;
     
        public int getId() {
            return id;
        }
     
        public void setId(int id) {
            this.id = id;
        }
     
        @Override
        public String toString() {
            return libelle;// ou ce que bon vous semble
        }
     
     
        @OneToMany(cascade = CascadeType.ALL, mappedBy = "parent")
        private Set<Enfant> enfants;
     
        public Set getEnfants () {return enfants;}
     
        public void setEnfants (Set<Enfant> Enfants) {this.enfants = enfants;}
     
        @Column(name="libelle")
        private String libelle;
     
        public String getLibelle() {
            return libelle;
        }
     
        public void setLibelle(String libelle) {
            this.libelle = libelle;
        }
     
        public Parent() {
        }
     
        public Parent(String libelle) {
            this.libelle = libelle;
        }
     
    }

    et une entité enfant

    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
    @Entity
    @Table(name = "Enfant", catalog = "", schema = "")
    public class Enfant implements Serializable {
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private int id;
     
        public Enfant() {
        }
     
        public int getId() {
            return id;
        }
     
        public void setId(int id) {
            this.id = id;
        }
     
        @Override
        public String toString() {
            return libelle;// ou ce que bon vous semble
        }
     
     
        @Column(name="LIBELLE",unique=false)
        private String libelle;
     
        public String getLibelle() {
            return libelle;
        }
     
        public void setLibelle(String libelle) {
            this.libelle = libelle;
        }
     
     
        @ManyToOne(optional=false)
        @JoinColumn()
        private Parent parent;
     
     
        public Parent getParent () {return parent;}
        public void setParent (Parent parent) {this.parent = parent;}
     
        public Mounth(int id, String libelle, Parent parent) {
            this.libelle = libelle;
            this.parent = parent;
        }
     
    }

    ensuite si on désire faire un delete en cascade sur un parent pour supprimer tout les fils :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    em = emf.createEntityManager();
                em.getTransaction().begin();
                Parent p = em.find(Parent.class, id);
                em.remove(p); 
                em.getTransaction().commit();
                em.close();

    voila !


    --
    Cdt
    Mhamed
    Si on tombe un jour... c'est pour mieux se relever !!
    Take a look

    Mon début de carrière

  12. #12
    Nouveau membre du Club
    Inscrit en
    avril 2009
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : avril 2009
    Messages : 30
    Points : 27
    Points
    27
    Par défaut exmple de classe qui présente les fonctions de base update persiter remove
    Salut a tout le monde,

    Ceci devrait marcher
    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
     
     
    import javax.ejb.Stateless;
     
    import entity.bean.Produit;
     
    import java.util.List;
     
    import javax.persistence.EntityManager;
    import javax.persistence.Persistence;
    import javax.persistence.PersistenceContext;
    import javax.persistence.Query;
     
    @Stateless(mappedName="chemin de mappage")
    public class SessionBeanProduit implements SessionBeanProduitRemote, SessionBeanProduitLocal {
     
        public SessionBeanProduit() {
        }
     
        @PersistenceContext(unitName="nom de l'unité de persitence")
        private EntityManager em;
        private Produit pdt;
     
        public Produit getPdt() {
      	return pdt;
        }
        public void setPdt(Produit pdt) {
      	this.pdt = pdt;
        }
        public EntityManager getEm() {
      	  	if (em == null) {
      				em = Persistence.createEntityManagerFactory(
      						"nom de l'unité de persitence").createEntityManager();
      			}
      			return em;
      	}
      	public void setEm(EntityManager em) {
      			this.em = em;
      	}
     
    //update
        public Object mergeEntity(Object entity) {
          return em.merge(entity);
        }
     
    //persist
        public Object persistEntity(Object entity) {
          em.persist(entity);
          return entity;
        }
     
        public List<Produit> queryProduitFindAll() {
          return em.createNamedQuery("Produit.findAll").getResultList();
        }
     
    //cherche tous les enregistrements
        public Produit ProduitFindOnly(int identity) {
      	  return (Produit)em.find(Produit.class, identity);
     
      	  }
     
     
    //cherche tous les enregistrements par intervalle
        public List<Produit> queryProduitFindAllByRange(int firstResult,
                                                        int maxResults) {
          Query query = em.createNamedQuery("Produit.findAll");
          if (firstResult > 0) {
            query = query.setFirstResult(firstResult);
          }
          if (maxResults > 0) {
            query = query.setMaxResults(maxResults);
          }
          return query.getResultList();
        }
     
    //supprime
        public void removeProduit(int ref) {
          pdt = (Produit)em.find(Produit.class, ref);
          em.remove(pdt);
        }
     
      }
    Bonne suite

Discussions similaires

  1. Participez à la création d'une FAQ APIs Google
    Par Bovino dans le forum APIs Google
    Réponses: 2
    Dernier message: 20/11/2011, 09h06
  2. Participez à la création d'une FAQ Prototype / script.aculo.us
    Par Bovino dans le forum Bibliothèques & Frameworks
    Réponses: 0
    Dernier message: 03/01/2011, 18h18
  3. Réponses: 0
    Dernier message: 24/07/2010, 16h17
  4. Création de la FAQ SQL !!! (Voulez-vous participer ?)
    Par Maxence HUBICHE dans le forum Langage SQL
    Réponses: 47
    Dernier message: 20/12/2009, 04h52
  5. Participez à l'enrichissement de la FAQ UML
    Par Matthieu Brucher dans le forum Contribuez
    Réponses: 5
    Dernier message: 16/12/2005, 10h37

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