Source: Freelancertech Blog

Freelancertech Blog Introduction à JPA (Java Persistence API )

La Java Persistence API (abr&eacute;g&eacute;e en JPA), est une interface de programmation Java permettant aux d&eacute;veloppeurs d'organiser des donn&eacute;es relationnelles dans des applications utilisant la plateforme Java. Lire aussi sur SlideShare ...Transcript1. Introduction &agrave; JPA (Java Persistence API )2. www.facebook.com/pages/FreelancerTech/822357474482862 www.twitter.com/FREELANCERTECH (@FREELANCERTECH) Une &eacute;quipe d'experts dans leur domaine technologique qui ont d&eacute;cid&eacute; de se mettre ensemble pour offrir leurs services en fonction de leurs disponibilit&eacute;s, www.freelancertech.net3. • Historique • ORM : Object Relational Mapping • JPA : Java Persistence Api • Entity: Entit&eacute;s • Autres annotations • Contexte de persistance • Op&eacute;rations prises en charge par le gestionnaire d'entit&eacute;s • Cycle de vie d'une instance d'entit&eacute; • Obtention d'une fabrique EntityManagerFactory • Cr&eacute;ation du gestionnaire d'entit&eacute; EntityManager • Exemple d'insertion d'un livre • Relations entre entit&eacute;s • R&eacute;f&eacute;rence • Questions Plan www.freelancertech.net4. Base de donn&eacute;e MySQL Couche DAO Couche M&eacute;tier Couche UI JDBC Historique : Acc&egrave;s directement &agrave; la base de donn&eacute;e grâce &agrave; l'API standard JDBC de Java5. • Pour des raisons de performances, le coût d'ouverture / fermeture d'une connexion n'est pas n&eacute;gligeable, o Connection con = DriverManager.getConnection(url, "login", "password"); o //les ordres SQL o con.close(); • L'utilisation du langage SQL rend la couche DAO difficilement maintenable, o String insertStatement = "Insert into Client(Nom, Prenom,Nature) values (?, ?, ?)" Probl&eacute;matiques de l'acc&egrave;s direct &agrave; la BD &agrave; l'aide de jdbc : www.freelancertech.net6. Pour pallier &agrave; cette probl&eacute;matique et faciliter l'&eacute;criture de la couche DAO, La communaut&eacute; Java a donc fait naître des Frameworks ORM , tels que Hibernate, Toplink, EclipseLink www.freelancertech.net7. ORM : Object Relational Mapping Base de donn&eacute;e MySQL ORM • Hibernate • Toplink • EclipseLink Couche DAO JDBC Pool de Connexions Objet image de la BD www.freelancertech.net [1]8. ReFactoring de la fonction enregistr&eacute;e de notre couche DAO www.freelancertech.net9. Devant le succ&egrave;s des Frameworks ORM, Sun a d&eacute;cid&eacute; de standardiser une couche ORM via une sp&eacute;cification appel&eacute;e JPA apparue en même temps que Java 5 www.freelancertech.net10. JPA : Java Persistence Api Base de donn&eacute;e MySQL Impl&eacute;mentation • Hibernate • Toplink • EclipseLink Couche DAO JDBC Pool de Connexions [interface] JPA La sp&eacute;cification JPA est un ensemble d'interface du package javax.persistence [ EntityManager ] void persist(Entity entit&eacute;) Exemple : javax.persistence.Entity; javax.persistence.EntityManagerFactory; javax.persistence.EntityManager; javax.persistence.EntityTransaction; www.freelancertech.net11. Refactoring de la fonction enregistr&eacute;e de notre couche DAO www.freelancertech.net12. • JPA peut être utilis&eacute; par toutes les applications Java, Java SE ou Java EE. • Mapping O/R (objet-relationnel) avec les tables de la BD, facilit&eacute;e par les Annotations. • Un langage de requête objet standard JPQL pour la r&eacute;cup&eacute;ration des objets, Ses principaux avantages sont les suivants : JPA : Java Persistence Api select p from Personne p order by p.nom asc www.freelancertech.net13. Entity: Entit&eacute;s @Entity @Table(name = "BOOK") public class Book { @Id @GeneratedValue private Long id; @Column(name = "TITLE",nullable = false) private String title; private Float price; @Basic(fetch = FetchType.LAZY) @Column(length = 2000) private String description; private String isbn; private Integer nbOfPage; private Boolean illustrations //Les Getters et les Setters [1]14. Autres annotations ? Voir par exemple : JPA Reference http://www.objectdb.com/api/java/jpa ? Les curieux peuvent consulter la sp&eacute;cification java EE 6 ou le tutorial (ou un bon livre) www.freelancertech.net15. Contexte de persistance Ensemble des instances d'entit&eacute;s g&eacute;r&eacute;es a un instant donn&eacute;, g&eacute;r&eacute;es par qui ? Le gestionnaire d'entit&eacute;s : EntityManager Ce contexte peut donc être consid&eacute;r&eacute; comme un cache de premier niveau : c'est un espace r&eacute;duit ou le gestionnaire stocke les entit&eacute;s avant d'&eacute;crire son contenu dans la base de donn&eacute;es, www.freelancertech.net16. Op&eacute;rations prises en charge par le gestionnaire d'entit&eacute;s NB : Un flush() est automatiquement effectu&eacute; au moins &agrave; chaque commit de la transaction en cours, www.freelancertech.net [2]17. Cycle de vie d'une instance d'entit&eacute; www.freelancertech.net [2]18. Obtention d'une fabrique EntityManagerFactory L' interface EntityManagerFactory permet d'obtenir une instance de l'objet EntityManager, EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpa"); « jpa » est le nom de l'unit&eacute; de persistance, d&eacute;finie dans le fichier de configuration de la couche JPA METAINF/persistence.xml. [3]19. Cr&eacute;ation du gestionnaire d'entit&eacute; EntityManager EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpa"); EntityManager em = emf.createEntityManager() ; www.freelancertech.net20. Exemple d'insertion d'un livre public class Main { public static void main(String[] args) { // On cr&eacute;e une instance de livre Book book = new Book(); book.setTitle("MUGC: JPAMYSQL"); book.setPrice(12.5F); book.setDescription("Science fiction"); ... // On r&eacute;cup&egrave;re un pointeur sur l'entity manager // Remarque : dans une appli web, pas besoin de faire tout cela ! EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpa"); EntityManager em = emf.createEntityManager(); // On rend l'objet « persistant » dans la base (on l'ins&egrave;re) EntityTransaction tx = em.getTransaction(); tx.begin(); em.persist(book); tx.commit(); em.close(); emf.close(); } Version Java SE Version Java EE @Stateless public class BookBean { @PersistenceContext(unitName = "jpa") private EntityManager em; public void createBook() { Book book = new Book(); book.setTitle("MUGC: JPAMYSQL"); book.setPrice(12.5F); book.setDescription("Science fiction"); book.setIsbn("1-84023-742-2"); book.setNbOfPage(354); book.setIllustrations(false); em.persist(book); // R&eacute;cup&egrave;re le livre dans la BD par sa cl&eacute; primaire book = em.find(Book.class, 1234L); System.out.println(book); } } www.freelancertech.net [1]21. • La Persistence Unit : organise les meta donn&eacute;es qui d&eacute;finissent le mapping entre les entit&eacute;s et la base de donn&eacute;e dans le fichier de configuration METAINF/persistence.xml • La Persistence Manager Factory r&eacute;cup&egrave;re ces metas donn&eacute;es de la Persistence Unit et les interpr&egrave;tent pour cr&eacute;er des Persistence Manager (EntityManager) • Le Persistence Mangager (EntiyManager) g&egrave;re les &eacute;changes entre le code et la base de donn&eacute;e, c'est &agrave; dire le cycle de vie des entit&eacute;s • Enfin, les op&eacute;rations du EntityManager est englob&eacute; dans une Transaction. Fonctionnement de JPA [4]22. Relations entre entit&eacute;s Relation un-&agrave;-un @Entity @Table(name = "jpa03_hb_personne") public class Personne { ... @OneToOne(cascade = CascadeType.ALL, fetch=FetchType.LAZY) /*@OneToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.REMOVE}, fetch=FetchType.LAZY) */ @JoinColumn(name = "adresse_id", unique = true, nullable = false) private Adresse adresse; ... } @Entity @Table(name = "jpa03_hb_adresse") public class Adresse{ ... /*n'est pas obligatoire*/ @OneToOne(mappedBy = "adresse", fetch=FetchType.EAGER) private Personne personne; ... }www.freelancertech.net [3]23. Relations entre entit&eacute;s Relation un-&agrave;-plusieurs et plusieurs-&agrave;-un @Entity @Table(name="jpa05_hb_article") public class Article{ ... // relation principale Article (many) -> Category (one) impl&eacute;ment&eacute;e par une cl&eacute; // &eacute;trang&egrave;re (categorie_id) dans Article // 1 Article a n&eacute;cessairement 1 Categorie (nullable=false) @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name = "categorie_id", nullable = false) private Categorie categorie; ... } @Entity @Table(name="jpa05_hb_categorie") public class Categorie{ ... // relation inverse Categorie (one) -> Article (many) de la relation Article (many)- > Categorie (one) @OneToMany(mappedBy = "categorie", cascade = { CascadeType.ALL }) private Set<Article> articles = new HashSet<Article>(); ... } www.freelancertech.net [3]24. Relations entre entit&eacute;s Relation un-&agrave;-plusieurs et plusieurs-&agrave;-un @Entity @Table(name="jpa06_hb_categorie") public class Categorie{ ... // relation OneToMany non inverse (absence de mappedby) Categorie (one) -> Article (many) // impl&eacute;ment&eacute;e par une table de jointure Categorie_Article pour qu'&agrave; partir d'une cat&eacute;gorie // on puisse atteindre plusieurs articles @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) private Set<Article> articles = new HashSet<Article>(); ... } www.freelancertech.net [3]25. Relations entre entit&eacute;s Relation plusieurs-&agrave;-plusieurs @Entity @Table(name = "jpa07_hb_activite") public class Activite{ ... // relation inverse Activite -> Personne @ManyToMany(mappedBy = "activites") private Set<Personne> personnes = new HashSet<Personne>(); ... } @Entity @Table(name = "jpa07_hb_personne") public class Personne { ... // relation Personne (many) -> Activite (many) via une table de jointure personne_activite @ManyToMany(cascade={CascadeType.PERSIST}) @JoinTable(name="jpa07_hb_personne_activite", joinColumns = @JoinColumn(name = "PERSONNE_ID"), inverseJoinColumns = @JoinColumn(name = "ACTIVITE_ID"))

Read full article »
Est. Annual Revenue
$100K-5.0M
Est. Employees
1-25
CEO Avatar

CEO

Update CEO

CEO Approval Rating

- -/100