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

  • 32
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager