Précédent   Forum des professionnels en informatique > Java > Général Java > Persistance > JPA
JPA Forum d'entraide sur l'API de persistance JPA (Java Persistence API)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/04/2008, 14h06   #1
Expert Confirmé Sénior
 
Avatar de djo.mos
 
Inscription : octobre 2004
Messages : 4 668
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 4 668
Points : 5 625
Points : 5 625
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
__________________
Mon Blog | Mes Cours | Moi sur twitter
djo.mos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/05/2008, 21h56   #2
Membre du Club
 
Avatar de fisico
 
Inscription : septembre 2003
Messages : 98
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 98
Points : 64
Points : 64
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
fisico est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 16h40   #3
Membre habitué
 
Inscription : mars 2007
Messages : 131
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 131
Points : 100
Points : 100
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>);
inconnu652000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 16h57   #4
Modérateur
 
Avatar de OButterlin
 
Homme
Inscription : novembre 2006
Messages : 5 067
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2006
Messages : 5 067
Points : 5 660
Points : 5 660
Comment créer une propriété dans un Entity non liée à un champ de la table cible :

- Utiliser l'annotation @Transient
OButterlin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2008, 10h59   #5
Modérateur
 
Avatar de OButterlin
 
Homme
Inscription : novembre 2006
Messages : 5 067
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2006
Messages : 5 067
Points : 5 660
Points : 5 660
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 :
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 :
1
2
 
select a.uid, a.nom, b.texte from table1 a join table2 b on a.uid=b.uid
OButterlin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2008, 16h05   #6
Invité(e)
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Comment créer une requête:

deux solutions:


Solution 1:

soit dans l'Entity:
Code :
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 :
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 :
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 :
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
  Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2008, 16h11   #7
Invité(e)
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Comment faire un update:

Code :
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
  Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2008, 16h48   #8
Modérateur
 
Avatar de OButterlin
 
Homme
Inscription : novembre 2006
Messages : 5 067
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2006
Messages : 5 067
Points : 5 660
Points : 5 660
Citation:
Envoyé par amazoone Voir le message
Comment faire un update:

Code :
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 :
1
2
3
4
 
em.merge(monEntity);
ou
em.persist(monEntity);
2) Non JTA
Code :
1
2
3
4
5
6
7
8
9
 
EntityTransaction tx = em.getTransaction();
tx.begin();
 
em.merge(monEntity);
ou
em.persist(monEntity);
 
tx.commit();
OButterlin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2008, 11h42   #9
Membre du Club
 
Développeur informatique
Inscription : août 2007
Messages : 118
Détails du profil
Informations personnelles :
Âge : 34

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2007
Messages : 118
Points : 49
Points : 49
Envoyer un message via MSN à adamo901
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 :
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.
adamo901 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2008, 10h43   #10
Membre Expert
 
Avatar de nicorama
 
Inscription : juillet 2006
Messages : 759
Détails du profil
Informations personnelles :
Âge : 36
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : juillet 2006
Messages : 759
Points : 1 158
Points : 1 158
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 :
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 :
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 :
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());
        }

    }
__________________
Robusta Web Library : Clients RESTful open source pour Java, Android & GWT.
API Simple et Productive. Avec style.
nicorama est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2008, 16h13   #11
Membre confirmé
 
Avatar de mhamedbj
 
Inscription : février 2007
Messages : 403
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 403
Points : 254
Points : 254
Par défaut Comment faire un delete en cascade (Version simple)

Bonjour,

supposant deux entité parent et fils :

Code :
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 :
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 :
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
mhamedbj est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/10/2009, 20h13   #12
Invité régulier
 
Inscription : avril 2009
Messages : 30
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 30
Points : 7
Points : 7
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 :
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
ndeyemaroc est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h08.


 
 
 
 
Partenaires

Hébergement Web