1 Partie 4 : Hibernate / JPA Présentation générale Architecture du noyau Hi
1 Partie 4 : Hibernate / JPA Présentation générale Architecture du noyau Hibernate Environnement de travail Classes persistantes dans Hibernate Opérations du gestionnaire de persistance Méta-données : fichiers de mapping/annotations des classes métier Récupération d’instances persistantes Requêtes Transactions ©Maude Manouvrier - Univ. Paris Dauphine 86 Hibernate : généralités (1/3) ©Maude Manouvrier - Univ. Paris Dauphine – repris et adapté de [Pat05] et [Gri09] 87 Outil ORM ou Cadre (Framework) de persistance libre (open source) gérant la persistance des objets Java/J2EE en base de données relationnelle [Wikipédia, Pat05] Version 4 (2010: 3.6) : implémentation du standard de persistance EJB 3.0 Java Persistence API (JPA) Possibilité d’être utilisé aussi bien dans un développement client lourd, que dans un environnement web léger de type Apache Tomcat ou dans un environnement J2EE complet [Wikipédia] Code SQL généré à l’exécution via des informations fournies dans un document de correspondance (mapping) XML ou des annotations 2 Hibernate : généralités (2/3) ©Maude Manouvrier - Univ. Paris Dauphine – repris de http://hibernate.org/ 88 Hibernate : généralités (3/3) ©Maude Manouvrier - Univ. Paris Dauphine 89 Différents modules : Hibernate Core : API native implémentant les services de base pour la persistance • Méta-données au format XML (+ annotations depuis la version 3.6) • Langage HQL et interface pour écrire des requêtes Hibernate Annotations (inclus dans Hibernate Core 3.6) : Remplacement des fichiers XML par des annotations JDK 5.0 implémentant les annotations du standard JPA + annotations spécifiques à Hibernate Hibernate Entity Manager : Implémentation de la partie des spécifications JPA concernant • Les interfaces de programmation, • Les règles de cycle de vie des objets persistants • Les fonctionnalités d’interrogation Hibernate Entity Manager = wrapper au dessus du noyau Hibernate implémentant une solution complète de persistance JPA (cf. documentation Hibernate) 3 Architecture du noyau Hibernate (1/12) ©Maude Manouvrier - Univ. Paris Dauphine – repris et adapté de http://www.hibernate.org/hib_docs/reference/fr/html/architecture.html 90 hibernate.properties : Fichier de configuration • Version XML : hibernate.cfg.xml permettant un paramétrage plus fin • Configuration par programmation XML mapping ou annotations : • Méta-données (paramètres) décrites sous la forme de fichiers de correspondance XML ou sous forme d’annotation • Utilisées pour mettre en correspondance les classes Java et le modèle relationnel XML mapping ou annotations Architecture du noyau Hibernate (2/12) ©Maude Manouvrier - Univ. Paris Dauphine – repris et adapté de http://www.hibernate.org/hib_docs/reference/fr/html/architecture.html 91 Objet temporaire Objet persistent (ayant une durée de vie longue) Interface principale utilisée par Hibernate Interface permettant d’obtenir des instances Session ou EntityManager SessionFactory (Hibernate) EntityManagerFactory (JPA) Session (Hibernate) EntityManager (JPA) 4 Architecture du noyau Hibernate (3/12) ©Maude Manouvrier - Univ. Paris Dauphine – repris de http://www.hibernate.org/hib_docs/reference/fr/html/architecture.html 92 SessionFactory ou EntityManagerFactory : • Cache immuable (threadsafe) des correspondances (mappings) vers une (et une seule) base de données • Coûteuse à construire car implique l’analyse des fichiers de configuration • Pouvant contenir un cache optionnel de données (de second niveau) réutilisable entre les différentes transactions • Construite à partir d’un objet (Ejb3)Configuration Session ou EntityManager : • Objet mono-threadé, à durée de vie courte, représentant une conversation entre l'application et l'entrepôt de persistance • Encapsule une connexion JDBC • Contient un cache (de premier niveau et obligatoire) des objets persistants Architecture du noyau Hibernate (4/12) ©Maude Manouvrier - Univ. Paris Dauphine – repris et adapté de [Pat05] private static Configuration configuration; private static SessionFactory sessionFactory; private Session s; try { // étape 1 configuration = new Configuration(); // étape 2 sessionFactory = configuration.configure().buildSessionFactory(); // étape 3 s = sessionFactory.openSession(); } catch (Throwable ex) { log.error("Building SessionFactory failed.", ex); throw new ExceptionInInitializerError(ex); } Consultation du fichier hibernate.cfg.xml présent dans le classpath de l’application Analyse du fichier de mapping Conseil : utiliser une classe HibernateUtil pour factoriser ces étapes 93 5 Architecture du noyau Hibernate (5/12) ©Maude Manouvrier - Univ. Paris Dauphine – repris et adapté du tutorial d’Hibernate 3 94 Exemple de fichier de configuration hibernate.cfg.xml : <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- Database connection settings --> <property name="hibernate.connection.driver_class">org.postgresql.Driver </property> <property name="hibernate.connection.password">passwd</property> <property name="hibernate.connection.url">jdbc:postgresql:BDTest2</property> <property name="hibernate.connection.username">login</property> <!-- SQL dialect --> <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property> <!-- Enable Hibernate's automatic session context management --> <property name="current_session_context_class">thread</property> <!-- Disable the second-level cache --> <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider </property> <!-- Echo all executed SQL to stdout --> <property name="show_sql">true</property> <!-- Drop and re-create the database schema on startup --> <property name="hbm2ddl.auto">create</property> <mapping resource="events/Event.hbm.xml"/> <mapping resource="events/Person.hbm.xml"/> </session-factory> </hibernate-configuration> Architecture du noyau Hibernate (6/12) ©Maude Manouvrier - Univ. Paris Dauphine 95 Déclaration du type de document utilisé par l’analyseur syntaxique (parseur) XML pour valider le document de configuration d’après la DTD de configuration d’Hibernate : <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration- 3.0.dtd"> Paramètres de configuration nécessaires pour la connexion JDBC : <property name="hibernate.connection.driver_class">org.postgresql.Driver </property> <property name="hibernate.connection.password">passwd</property> <property name="hibernate.connection.url">jdbc:postgresql:BDTest2 </property> <property name="hibernate.connection.username">login </property> 6 Architecture du noyau Hibernate (7/12) ©Maude Manouvrier - Univ. Paris Dauphine 96 Spécification de la variante de SQL générée par Hibernate : <!-- SQL dialect --> <property name="dialect">org.hibernate.dialect.PostgreSQLDialect </property> Activation de la génération automatique des schémas de base de données - directement dans la base de données : <!-- Drop and re-create the database schema on startup --> <property name="hbm2ddl.auto">create</property> Fichier de configuration (fichier de mapping) des classes persistantes : <mapping resource="events/Event.hbm.xml"/> <mapping resource="events/Person.hbm.xml"/> Architecture du noyau Hibernate (8/12) ©Maude Manouvrier - Univ. Paris Dauphine 97 Possibilité de transmettre les paramètres de configuration à l’exécution Configuration cfg = new Configuration() .addClass(Person.class) .addClass(Event.class) .setProperty(Environment.HBM2DDL_AUTO, "create"); cfg.setProperty("hibernate.show_sql", "true"); cfg.setProperty("hibernate.connection.driver_class", "org.postgresql.Driver") .setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect") .setProperty("hibernate.connection.url", "jdbc:postgresql:BDTest1") .setProperty("hibernate.connection.username", "login") .setProperty("hibernate.connection.password", "passwd") .setProperty("hibernate.order_updates", "true"); factory = cfg.buildSessionFactory(); 7 public class Person { private Long id; private int age; private String firstname; private String lastname; private Set events ; private Set emailAddresses ; … } public class Event { private Long id; private String title; private Date date; private Set participants; … } ©Maude Manouvrier - Univ. Paris Dauphine – repris et adapté de http://docs.jboss.org/hibernate/core/3.6/reference/fr-FR/html_single/ 98 Modèle relationnel : Modèle objet : Exemple : Tutorial Hibernate Architecture du noyau Hibernate (9/12) ©Maude Manouvrier - Univ. Paris Dauphine – repris et adapté du tutorial d’Hibernate 3 99 Exemple de fichier de correspondance pour la classe Person Person.hbm.xml : <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="events.Person" table="PERSON"> <id name="id" column="PERSON_ID"> <generator class="native"/> </id> <property name="age"/> <property name="firstname"/> <property name="lastname"/> <set name="events" table="PERSON_EVENT"> <key column="PERSON_ID"/> <many-to-many column="EVENT_ID" class="events.Event"/> </set> <set name="emailAddresses" table="PERSON_EMAIL_ADDR"> <key column="PERSON_ID"/> <element type="string" column="EMAIL_ADDR"/> </set> </class> </hibernate-mapping> Déclaration de la DTD Déclaration du mapping Classe event.Person « mappée » en relation PERSON Mapping de l’identifiant Mapping de collection Attribut de jointure entre PERSON et PERSON_EVENT Pour préciser qu’il y a une « table association » Pour définir une collection de valeurs 8 Architecture du noyau Hibernate (10/12) ©Maude Manouvrier - Univ. Paris Dauphine 10 0 Mapping par annotation – exemple de la classe Person : @Entity @Table (name="PERSON") public class Person { private Long id; private int age; private String firstname; private String lastname; public Person() {} // Accessor methods @Id@GeneratedValue(strategy=GenerationType.AUTO) @Column(name="PERSON_ID") public Long getId() { return this.id; } private Set events = new HashSet(); @ManyToMany @JoinTable( name="PERSON_EVENT", joinColumns=@JoinColumn(name="PERSON_ID"), inverseJoinColumns=@JoinColumn(name="EVENT_ID") ) protected Set getEvents() { return events;} private Set emailAddresses = new HashSet(); @CollectionOfElements @JoinTable( table=@Table(name="PERSON_EMAIL_ADDR"), joinColumns = @JoinColumn(name="PERSON_ID") ) public Set getEmailAddresses() { return emailAddresses; } } Classe event.Person « mappée » en relation PERSON Mapping de l’identifiant Mapping de collection d’objets Mapping de collection de valeurs Attention avant la version 3.6 : il faut utiliser Hibernate Annotation !! Architecture du noyau Hibernate (11/12) ©Maude Manouvrier - Univ. Paris Dauphine – Figure reprise de [Pat05] Diagramme d’états d’un objet manipulé avec Hibernate États définis par rapport à un contexte de persistance (objet Session) 10 1 Etat New dans JPA Etat Managed dans JPA 9 Architecture du noyau Hibernate (12/12) ©Maude Manouvrier - Univ. Paris Dauphine – repris et adapté du doc. de ref. d’Hibernate 3 102 Passager/Temporaire/Éphémère (transient) : • Instance non associée (et n'ayant jamais été associée) à un contexte de persistance • Instance sans identité persistante (i.e. valeur de clé primaire) Persistant : • Instance associée à un contexte de persistance (Session) • Instance possèdant une identité persistante (i.e. valeur de clé primaire) et, peut-être, un enregistrement/nuplet correspondant dans la base • Pour un contexte de persistance particulier, garantie par Hibernate de l’équivalence entre l'identité persistante et l'identité Java (i.e. emplacement mémoire de l'objet) Détaché • Instance ayant été associée au contexte de persistance à présent fermé ou instance ayant été sérialisée vers un autre processus • Instance possèdant une identité persistante et peut-être un enregistrement/nuplet correspondant dans la base • Aucune garantie par Hibernate sur la relation entre l'identité persistante et l'identité Java Environnement de travail avec Hibernate (1/6) ©Maude Manouvrier - Univ. Paris Dauphine – repris et adapté du doc. de ref. d’Hibernate 3, de [Pat05] et de http://www.objis.com/formation-java/tutoriel-hibernate-installation-analyse-hibernate-3-jar.html 103 Bibliothèques Hibernate Core (en plus de hibernate3.jar) : Antlr-xxx.jar ANTLR (Another Tool for Language Recognition) - outil permettant de développer uploads/Ingenierie_Lourd/ orm-mm-parts1-amp-2-2slides.pdf
Documents similaires










-
32
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Apv 02, 2022
- Catégorie Heavy Engineering/...
- Langue French
- Taille du fichier 3.5456MB