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.
:merci: à tous
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.
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
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