Cedric Dumoulin Aperçu Rappels Contexte de Persistance et état des entités Associations Héritage Classes embarquées Langage de requêtes JPA et Container JEE Cours Le cours de Laurent Guerin Page du site http://www.laurent-guerin.fr/jpa Lien direct Cours-JPA-v1.2.pdf http://www.laurent-guerin.fr/jpa/Cours-JPAv1.2.pdf?attredirects=0&d=1 Licences Creative Commons (CC) : BY-NC-SA" ( cf http://creativecommons.org/licenses/ ) <?xml version="1.0" encoding="UTF-8"?> <persistence version="2.1" ... <persistence-unit name="people" transaction-type="RESOURCE_LOCAL"> <class>de.vogella.jpa.eclipselink.model.Person</class> Rappels <properties> <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver" /> <property name="javax.persistence.jdbc.url" value="jdbc:derby:F:\temp\derby\db1;create=true" /> <!-- EclipseLink should create the database schema automatically --> <property name="eclipselink.ddl-generation" value="drop-and-create-tables" /> <property name="eclipselink.ddl-generation.output-mode" value="database" /> </properties> @Entity public class Person { @Id </persistence-unit> @GeneratedValue(strategy = GenerationType.TABLE) </persistence> private String id; private String firstName; private String lastName; // ... } factory = Persistence .createEntityManagerFactory(PERSISTENCE_UNIT_NAME); EntityManager em = factory.createEntityManager(); // ... em.getTransaction().begin(); Person person = new Person(); person.setFirstName("Jim_" + i); person.setLastName("Knopf_" + i); em.persist(person); em.getTransaction().commit(); // ... } DB Copyright Laurent Guerin (Java Parsistence API v1.1) Etats d’une entité http://java.boot.by/scbcd5-guide/ch06.html Copyright Copyright Laurent Guerin (Java Parsistence API v1.1) Cours-JPA-v1.1.pdf Slides 30 a 38 Les types de liens JPA 1 lien UML bidirectionel 2 demi liens Java uni-directionel ManyToOne OneToOne OneToOne OneToMany ManyToMany Lien (inverse side) Lien (owning side) ManyToMany Les types de liens JPA Une relation entre 2 entités 2 liens en Java Chaque lien à un sens ET une cardinalité : OneToOne OneToMany ManyToOne ManyToMany OwningSide Le coté « propriétaire » du lien Celui qui possède la Foreign Key Inverse Side Le coté référencé par le propriétaire Exemple – Many To One (Owning Side) @Entity public class Employee { @Id private int id; @ManyToOne private Department department; // ... } ONE: simple référence sur une entité One To Many (Inverse Side) @Entity public class Department { @Id private int id; @OneToMany(mappedBy="department") private Collection<Employee> employees; // ... } Attribut qui pointe sur cette entité dans l’owningSide Coté MANY : Collection Many To Many Introduction d’une table intermédiaire @Entity public class Employee { @Id private int id; // ... @ManyToMany private Collection<Project> projects; // ... Many To Many Spécification de la table intermédiaire @Entity public class Employee { OwningSide @Id (choix arbitraire) private int id; // ... @ManyToMany @JoinTable( name ="EMP_PROJ", InverseSide joinColumns=@JoinColumn(name="EMPLOYEE_ID"), inverseJoinColumns=@JoinColumn(name="PROJECT_ID") ) private Collection<Project> projects; // ... Chargement glouton/fainéant Lorsqu’une entité est chargé dans le « persistenceContext » par l’EntityManager, ses liens peuvent être: Immédiatement chargés : « eager loading » Chargés plus tard, quand l’application va les utiliser « lazy loading » @Entity public class Employee { @Id private int id; @OneToOne(fetch=FetchType.LAZY) private ParkingSpace parkingSpace; // ... } Entités et héritage Les entités supportent L’héritage de classe Les associations polymorphiques (qui pointe sur un type parent d’une hiérarchie) Les requêtes polymorphiques (qui retournent différent types d’une hiérarchie) (qui retourne un sous-type d’une hiérarchie) Une entités peut étendre une classe non entité Une classe non entité peut étendre une classe entité Une entité peut être abstraite Entités abstraites Une classe entity peut être marqué « abstract » Une entité abstraite est comme une entité concrète Mais elle ne peut pas être instancié ! Elle peut être employé dans une requête La requête retourne des types concrets Exemple entité abstraite @Entity public abstract class Employee { @Id protected Integer employeeId; ... } @Entity public class FullTimeEmployee extends Employee { protected Integer salary; ... } @Entity public class PartTimeEmployee extends Employee { protected Float hourlyWage; } Mapped superclasses Permet d’hériter d’une classe Dont des états doivent être persistant Mais qui ne doit pas être une entité Décorer avec javax.persistence.MappedSuperclass: Ce type de classe ne peut pas Etre dans une requête Être demandé a l’EntityManager ou dans une Query Il faut utiliser l’entity enfant Etre la cible d’une association d’une autre entité Il n’y a pas de table correspondant dans la DB Exemple Mapped Superclasses @MappedSuperclass public class Employee { @Id protected Integer employeeId; ... } @Entity public class FullTimeEmployee extends Employee { protected Integer salary; ... } @Entity public class PartTimeEmployee Employee { protected Float hourlyWage; extends ... } Superclasses non-entités Une entité peut hériter d’une classe non entité La supeclass peut être concrète ou abstraite L’état de la superclass est alors non persistant La superclasse ne peut pas Etre utilisé dans l’EntityManager, une requête Stratégies d’héritage Une table par hiérarchie Une table par entité concrète de la hiérarchie La table contient les propriété de la classe, et des classes parent Une table par classe de la hiérarchie La table contient uniquement les propriétés de la classe Il faut faire un « JOIN » pour obtenir toutes les propriétés Definir la strategie d’heritage Utiliser @Inheritance import javax.persistence.InheritanceType; public enum InheritanceType { SINGLE_TABLE, JOINED, TABLE_PER_CLASS }; Strategie par défaut InheritanceType.SINGLE_TABLE; Single Table InheritanceType.SINGLE_TABLE Toutes les instances d’une hiérarchie sont dans une seule et même table La table contient une colonne supplémentaire discriminant Peut être définit par une annotation Single Table Avantages Bon support pour les associations et les requêtes polymorphiques Inconvénients Les colonnes doivent être nullable Peut contenir beaucoup de valeurs null. Une table par classe concrete InheritanceType.SINGLE_TABLE Chaque classe concrète a sa propre table Chaque table contient toutes les propriétés (y compris des superclasses) Une table par classe concrete Avantages Diminue les valeurs nulles Inconvénients Mauvais support du polymorphisme Des join sur les tables sont requis Cette stratégie est optionnel Elle n’est pas supporté par toutes les implémentation de JPA Strategie « JOINED » InheritanceType.JOINED, La classe racine de la hiérarchie a sa propre table Chaque sous-classe a sa table Une table ne contient que les propriétés de la classe Strategie « JOINED » Avantages Bon support pour les associations et les requêtes polymorphiques Pas de valeurs nulles superflues Inconvénients Des join sont requis pour obtenir un objet Peut entrainer des mauvaises performances Les classes peuvent nécessiter une colonne discriminant Dépend de l’implémentation Pas un problème si on laisse la création de table auto Bibliographie Entity Inheritance Chap 37.2 - Java EE 7 Tutorial http://docs.oracle.com/javaee/7/tutorial/doc/ Classes embarquées Pourquoi faire ? Used to represent the state of an entity but don't have a persistent identity of their own Instances of an embeddable class share the identity of the entity that owns it Permet de concevoir en pensant “orienté objet” L’objet n’est pas persistant en lui-même Il est persisté avec l’entité qui le détient Exemple @Embeddable public class ZipCode { String zip; String plusFour; ... } Classe embarqué Même règles que les entity Mais annotation @Embeddable @Embedded est optionnel @Entity public class Address { @Id protected long id String street1; String street2; String city; String province; @Embedded ZipCode zipCode; String country; ... } Régles Classe embarqué Même règles que les entity Mais annotation @Embeddable Peut avoir des classes embarqués, des associations, … Bibliographie Embeddable Classes in Entities Chap 37.1.6 - Java EE 7 Tutorial http://docs.oracle.com/javaee/7/tutorial/doc/ Présentation Cours Laurent Guerin Cours-JPA-v1.2.pdf Slides s82p41 -> ss89p45 Bibliographie The Java Persistence Query Language Chap 39 - Java EE 7 Tutorial http://docs.oracle.com/javaee/7/tutorial/doc/ Cour Laurent Guerin http://www.laurent-guerin.fr/jpa/Cours-JPA- v1.1.pdf?attredirects=0&d=1 A faire !!! Tuto JEE 7 Managing Entities Bibliographie Managing Entities Chap 37.3 - Java EE 7 Tutorial http://docs.oracle.com/javaee/7/tutorial/doc/ Cour Laurent Guerin http://www.laurent-guerin.fr/jpa/Cours-JPA- v1.1.pdf?attredirects=0&d=1 Bibliographie The Java EE 7 Tutorial http://docs.oracle.com/javaee/7/tutorial/doc/ Java - JPA http://www.laurent-guerin.fr/jpa 45. JPA (Java Persistence API) JM Doudoux http://jmdoudoux.developpez.com/cours/developpons/java/chapjpa.php La persistance des données avec JPA http://fr.openclassrooms.com/informatique/cours/creez-votreapplication-web-avec-java-ee/la-persistance-des-donnees-avec-jpa Mapping Objects to Relational Databases: O/R Mapping In Detail http://www.agiledata.org/essays/mappingObjects.html The Object-Relational Impedance Mismatch http://www.agiledata.org/essays/impedanceMismatch.html Cour Laurent Guerin http://www.laurent-guerin.fr/jpa/Cours-JPA- v1.1.pdf?attredirects=0&d=1