SlideShare uma empresa Scribd logo
1 de 17
Baixar para ler offline
JPA2 BRIEF INTRO
                                by Tiziano Lattisi




mercoledì 13 febbraio 13
WHAT IS JPA2

               Java Persistence API

               JPA2 in Java EE 6 (JPA1 in Java EE 5)

               It’s a O/RM (Object Relational Mapping)

               Framework to provide persistence

               An object is a row in a master table (...)



mercoledì 13 febbraio 13
AND...

               annotation || XML descriptor (configuration by exception)

               POJO (Plain Old Java Object) based

               Outside container (no server required)

               No Bean interface required (no implements Serializable)

               Different persistence providers (Hibernate, EclipseLink, ...)



mercoledì 13 febbraio 13
CASE STUDY: LIBRARY

               The library contains several books

               The library can loan one or more books to a person



               Actors: Library, Book, Person, Loan




mercoledì 13 febbraio 13
O/RM
                public class Person {
                    private Long id;                                          PERSON
                    private String name;
                                                                           PK ID
                    private String surname;
                    private Date birthday;
                                                                       ?      NAME
                    private Collection<Loan> loanCollection;
                                                                              SURNAME
                       public Person() {}                                     GENRE
                       /* accessor methods */
                }                                               LOAN
                public class Loan {                     PK ID
                    private Long id;                           FROMDATE
                    private Date fromdate;
                    private Date todate;                   TODATE
                    private Person person;              FK PERSON
                    private Book book;
                                                        FK BOOK
                       public Loan(){ }
                }
                                                                               BOOK
                public class Book {                                        PK ID
                    private Long id;
                    private String title;                                     TITLE
                    private String description;                               DESCRIPTION
                       public Book(){ }                                       GENRE
                }


mercoledì 13 febbraio 13
O/RM


                    to map variables to database columns

                    to handle data types between database and Java

                    to map tables references in relationship between objects

                    to manage the cycle of life of the object




mercoledì 13 febbraio 13
PERSISTENCE.XML
         <?xml version="1.0" encoding="UTF-8"?>

         <persistence version="2.0" xmlns:xsi="http://java.sun.com/xml/ns/persistence"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://
         java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

             <persistence-unit name="DemoPU" transaction-type="RESOURCE_LOCAL">
               <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
               <properties>
                 <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:demo"/>
                 <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
                 <property name="javax.persistence.jdbc.user" value=""/>
                 <property name="javax.persistence.jdbc.password" value=""/>
                 <property name="eclipselink.ddl-generation" value="create-tables"/>
               </properties>
               <class>com.axiastudio.pypapi.demo.entities.Book</class>
               <class>com.axiastudio.pypapi.demo.entities.Loan</class>
               <class>com.axiastudio.pypapi.demo.entities.Person</class>
             </persistence-unit>

         </persistence>




mercoledì 13 febbraio 13
IDE HELPS US



               example:

               PU setup in
               Netbeans 7.2 IDE




mercoledì 13 febbraio 13
BY ANNOTATION
      @Entity
      @Table(name = "person")
      public class Person implements Serializable {

             @Id
             @GeneratedValue(strategy=GenerationType.AUTO)
             @Column(name = "id")
             private Long id;

             @Column(name = "name")
             private String name;

             @Column(name = "surname")
             private String surname;

             @Column(name = "birthday")
             @Temporal(TemporalType.DATE)
             private Date birthday;

             @OneToMany(mappedBy = "person", orphanRemoval = true, cascade=CascadeType.ALL)
             private Collection<Loan> loanCollection;

             public Person() { }
             /* accessor methods */
      }



mercoledì 13 febbraio 13
BY XML DESCRIPTOR

        <entity-mappings>
            ...
            <entity class="com.axiastudio.pypapi.demo.entities.Person"
                    metadata-complete="true">
                <table-name="PERSON"/>
                <attributes>
                    <id name="id"/>
                    <id name="name"/>
                    <id name="surname"/>
                    <id name="birthday"/>
                    <id name="id"/>
                </attributes>
            </entity>
        </entity-mappings>




mercoledì 13 febbraio 13
SEQUENCE

              by annotation
             @SequenceGenerator(name="genBook", sequenceName="book.book_id_seq",
                                initialValue=1, allocationSize=1)

             @Id
             @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="genBook")
             private Long id;




              by descriptor
             <id name="id">
                 <generated-value strategy="SEQUENCE" generator="genBook"/>
                 <sequence-generator name="genBook" sequence-name="book.book_id_seq"/>
             </id>




mercoledì 13 febbraio 13
INSERT

        import         javax.persistence.EntityManager;
        import         javax.persistence.EntityManagerFactory;
        import         javax.persistence.Persistence;
        import         com.axiastudio.pypapi.demo.entities.Book;
        import         com.axiastudio.pypapi.demo.entities.Genre;

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("DemoPU");
        em = emf.createEntityManager();

        Book book = new Book();
        book.setTitle("Dubliners");
        book.setDescription("a collection of 15 short stories");
        book.setGenre(Genre.ROMANCE);

        em.getTransaction().begin();
        em.persist(book);
        em.getTransaction().commit();




mercoledì 13 febbraio 13
SELECT
           CriteriaBuilder cb = em.getCriteriaBuilder();
           CriteriaQuery<Book> cq = cb.createQuery(Book.class);
           TypedQuery<Book> tq = em.createQuery(cq);
           List<Book> books = tq.getResultList();

           for( Book book: books ){
               switch (book.getDescription()) {

                           case "Anna Karenina":
                               assert "ROMANCE".equals(book.getGenre().toString());
                               break;

                           case "Pro JPA":
                               assert "REFERENCE".equals(book.getGenre().toString());
                               break;

                           }
                   }
           }




mercoledì 13 febbraio 13
SELECT (CRITERIA)

           CriteriaBuilder cb = em.getCriteriaBuilder();
           CriteriaQuery<Book> cq = cb.createQuery(Book.class);

           Root from = cq.from(Book.class);
           // from.get("description")
           Predicate predicate = cb.like(from.get(Book_.description), "%very%");
           cq = cq.where(predicate);

           TypedQuery<Book> tq = em.createQuery(cq);

           List<Book> books = tq.getResultList();
           assert books.size() == 1;
           assert "Anna Karenina".equals(books.get(0).getTitle());

           Book book = tq.getSingleResult();
           assert "Anna Karenina".equals(book.getTitle());




mercoledì 13 febbraio 13
UPDATE
           CriteriaBuilder cb = em.getCriteriaBuilder();
           CriteriaQuery<Person> cq = cb.createQuery(Person.class);
           Root from = cq.from(Person.class);
           cq = cq.where(cb.and(cb.equal(from.get(Person_.name), "Tiziano"),
                                cb.equal(from.get(Person_.surname), "Lattisi")));
           TypedQuery<Person> tq = em.createQuery(cq);
           Person person = tq.getSingleResult();

           assert "Tiziano".equals(person.getName()); assert person.getEmail() == null;
           Long key = person.getId();
           person.setEmail("tiziano.lattisi@gmail.com");

           Person personByKey = em.find(Person.class, key);
           assert "tiziano.lattisi@gmail.com".equals(personByKey.getEmail());

           em.detach(person);
           person = em.find(Person.class, key);
           assert ! "tiziano.lattisi@gmail.com".equals(person.getEmail());

           person.setEmail("tiziano.lattisi@gmail.com");
           em.getTransaction().begin(); em.merge(person); em.getTransaction().commit();
           Person personByKey2 = em.find(Person.class, key);
           assert "tiziano.lattisi@gmail.com".equals(personByKey2.getEmail());


mercoledì 13 febbraio 13
DELETE
             Person person = new Person();
             person("Tiziano");
             person("Lattisi");

             em.getTransaction().begin();
             em.persist(person);
             em.getTransaction().commit();
             Long aPrimaryKey = person.getId();

             [...]

             Person person = em.find(Person.class, aPrimaryKey);

             em.getTransaction().begin();
             em.remove(person);
             em.getTransaction().commit();

             person = em.find(Person.class, aPrimaryKey);
             assert person == null;




mercoledì 13 febbraio 13
AND NOW...


                                          Thank you.

                                        Tiziano Lattisi



                           Me: http://www.linkedin.com/in/tizianolattisi/
                             Slides: http://www.slideshare.net/lattisi/
                              Examples: http://tinyurl.com/crn3wwq




mercoledì 13 febbraio 13

Mais conteúdo relacionado

Mais procurados

Java e i database: da JDBC a JPA
Java e i database: da JDBC a JPAJava e i database: da JDBC a JPA
Java e i database: da JDBC a JPAbenfante
 
Building Sencha Themes
Building Sencha ThemesBuilding Sencha Themes
Building Sencha ThemesSencha
 
OOCSS for JavaScript Pirates jQcon Boston
OOCSS for JavaScript Pirates jQcon BostonOOCSS for JavaScript Pirates jQcon Boston
OOCSS for JavaScript Pirates jQcon BostonJohn Hann
 
2013-03-23 - NoSQL Spartakiade
2013-03-23 - NoSQL Spartakiade2013-03-23 - NoSQL Spartakiade
2013-03-23 - NoSQL SpartakiadeJohannes Hoppe
 
Transparent Object Persistence with FLOW3
Transparent Object Persistence with FLOW3Transparent Object Persistence with FLOW3
Transparent Object Persistence with FLOW3Karsten Dambekalns
 
Transparent Object Persistence with FLOW3
Transparent Object Persistence with FLOW3Transparent Object Persistence with FLOW3
Transparent Object Persistence with FLOW3Karsten Dambekalns
 
Delivering a Responsive UI
Delivering a Responsive UIDelivering a Responsive UI
Delivering a Responsive UIRebecca Murphey
 
OOCSS for Javascript pirates at jQueryPgh meetup
OOCSS for Javascript pirates at jQueryPgh meetupOOCSS for Javascript pirates at jQueryPgh meetup
OOCSS for Javascript pirates at jQueryPgh meetupBrian Cavalier
 
Slides python elixir
Slides python elixirSlides python elixir
Slides python elixirAdel Totott
 
Jpa queries
Jpa queriesJpa queries
Jpa queriesgedoplan
 
Core (Data Model) of WordPress Core
Core (Data Model) of WordPress CoreCore (Data Model) of WordPress Core
Core (Data Model) of WordPress CoreJake Goldman
 
Apache Cassandra Ignite Presentation
Apache Cassandra Ignite PresentationApache Cassandra Ignite Presentation
Apache Cassandra Ignite PresentationJared Winick
 
Using UIBinder with Ext GWT 3.0
Using UIBinder with Ext GWT 3.0Using UIBinder with Ext GWT 3.0
Using UIBinder with Ext GWT 3.0Sencha
 
Snapshot Testing @ CocoaheadsNL
Snapshot Testing @ CocoaheadsNLSnapshot Testing @ CocoaheadsNL
Snapshot Testing @ CocoaheadsNLLars Lockefeer
 

Mais procurados (18)

Java e i database: da JDBC a JPA
Java e i database: da JDBC a JPAJava e i database: da JDBC a JPA
Java e i database: da JDBC a JPA
 
Building Sencha Themes
Building Sencha ThemesBuilding Sencha Themes
Building Sencha Themes
 
OOCSS for JavaScript Pirates jQcon Boston
OOCSS for JavaScript Pirates jQcon BostonOOCSS for JavaScript Pirates jQcon Boston
OOCSS for JavaScript Pirates jQcon Boston
 
Active domain
Active domainActive domain
Active domain
 
2013-03-23 - NoSQL Spartakiade
2013-03-23 - NoSQL Spartakiade2013-03-23 - NoSQL Spartakiade
2013-03-23 - NoSQL Spartakiade
 
Transparent Object Persistence with FLOW3
Transparent Object Persistence with FLOW3Transparent Object Persistence with FLOW3
Transparent Object Persistence with FLOW3
 
Email Program By Marcelo
Email Program By MarceloEmail Program By Marcelo
Email Program By Marcelo
 
Transparent Object Persistence with FLOW3
Transparent Object Persistence with FLOW3Transparent Object Persistence with FLOW3
Transparent Object Persistence with FLOW3
 
Ch2
Ch2Ch2
Ch2
 
Delivering a Responsive UI
Delivering a Responsive UIDelivering a Responsive UI
Delivering a Responsive UI
 
OOCSS for Javascript pirates at jQueryPgh meetup
OOCSS for Javascript pirates at jQueryPgh meetupOOCSS for Javascript pirates at jQueryPgh meetup
OOCSS for Javascript pirates at jQueryPgh meetup
 
Slides python elixir
Slides python elixirSlides python elixir
Slides python elixir
 
Jpa queries
Jpa queriesJpa queries
Jpa queries
 
Core (Data Model) of WordPress Core
Core (Data Model) of WordPress CoreCore (Data Model) of WordPress Core
Core (Data Model) of WordPress Core
 
Apache Cassandra Ignite Presentation
Apache Cassandra Ignite PresentationApache Cassandra Ignite Presentation
Apache Cassandra Ignite Presentation
 
Using UIBinder with Ext GWT 3.0
Using UIBinder with Ext GWT 3.0Using UIBinder with Ext GWT 3.0
Using UIBinder with Ext GWT 3.0
 
Chapter ii(oop)
Chapter ii(oop)Chapter ii(oop)
Chapter ii(oop)
 
Snapshot Testing @ CocoaheadsNL
Snapshot Testing @ CocoaheadsNLSnapshot Testing @ CocoaheadsNL
Snapshot Testing @ CocoaheadsNL
 

Destaque

Presentación1
Presentación1Presentación1
Presentación1yudelky16
 
Evolución de las tecnologías educativas
Evolución de las tecnologías educativasEvolución de las tecnologías educativas
Evolución de las tecnologías educativasFranciscoUM
 
Origen y evolución de le te
Origen y evolución de le teOrigen y evolución de le te
Origen y evolución de le tenperez12
 
Exp. de teleformacion y aula virtual
Exp. de teleformacion y aula virtualExp. de teleformacion y aula virtual
Exp. de teleformacion y aula virtualnperez12
 
Esquema Origen y Evolución de le Tecnologia Educativa
Esquema Origen y Evolución de le Tecnologia EducativaEsquema Origen y Evolución de le Tecnologia Educativa
Esquema Origen y Evolución de le Tecnologia Educativacgcoca
 
Avances tecnológicos en Educación
Avances tecnológicos en EducaciónAvances tecnológicos en Educación
Avances tecnológicos en Educaciónjosuebilanderm1518
 
Evolucion de las tecnologias educativas
Evolucion de las tecnologias educativasEvolucion de las tecnologias educativas
Evolucion de las tecnologias educativasRuben Dario Roman T
 

Destaque (9)

Presentación1
Presentación1Presentación1
Presentación1
 
Evolución de las tecnologías educativas
Evolución de las tecnologías educativasEvolución de las tecnologías educativas
Evolución de las tecnologías educativas
 
Presentacion diapocitiva
Presentacion diapocitivaPresentacion diapocitiva
Presentacion diapocitiva
 
Origen y evolución de le te
Origen y evolución de le teOrigen y evolución de le te
Origen y evolución de le te
 
Exp. de teleformacion y aula virtual
Exp. de teleformacion y aula virtualExp. de teleformacion y aula virtual
Exp. de teleformacion y aula virtual
 
Origen de la tecnología educativa
Origen de la tecnología educativa Origen de la tecnología educativa
Origen de la tecnología educativa
 
Esquema Origen y Evolución de le Tecnologia Educativa
Esquema Origen y Evolución de le Tecnologia EducativaEsquema Origen y Evolución de le Tecnologia Educativa
Esquema Origen y Evolución de le Tecnologia Educativa
 
Avances tecnológicos en Educación
Avances tecnológicos en EducaciónAvances tecnológicos en Educación
Avances tecnológicos en Educación
 
Evolucion de las tecnologias educativas
Evolucion de las tecnologias educativasEvolucion de las tecnologias educativas
Evolucion de las tecnologias educativas
 

Semelhante a JPA2 - a brief intro

Data access 2.0? Please welcome: Spring Data!
Data access 2.0? Please welcome: Spring Data!Data access 2.0? Please welcome: Spring Data!
Data access 2.0? Please welcome: Spring Data!Oliver Gierke
 
Link.javaLink.javapackage com.bookstore.domain.model;import .docx
Link.javaLink.javapackage com.bookstore.domain.model;import .docxLink.javaLink.javapackage com.bookstore.domain.model;import .docx
Link.javaLink.javapackage com.bookstore.domain.model;import .docxSHIVA101531
 
AST Transformations
AST TransformationsAST Transformations
AST TransformationsHamletDRC
 
Terrastore - A document database for developers
Terrastore - A document database for developersTerrastore - A document database for developers
Terrastore - A document database for developersSergio Bossa
 
Groovy Ast Transformations (greach)
Groovy Ast Transformations (greach)Groovy Ast Transformations (greach)
Groovy Ast Transformations (greach)HamletDRC
 
OrientDB introduction - NoSQL
OrientDB introduction - NoSQLOrientDB introduction - NoSQL
OrientDB introduction - NoSQLLuca Garulli
 
Developing and maintaining a Java GraphQL back-end: The less obvious - Bojan ...
Developing and maintaining a Java GraphQL back-end: The less obvious - Bojan ...Developing and maintaining a Java GraphQL back-end: The less obvious - Bojan ...
Developing and maintaining a Java GraphQL back-end: The less obvious - Bojan ...Codemotion
 
An introduction into Spring Data
An introduction into Spring DataAn introduction into Spring Data
An introduction into Spring DataOliver Gierke
 
Devoxx08 - Nuxeo Core, JCR 2, CMIS
Devoxx08 - Nuxeo Core, JCR 2, CMIS Devoxx08 - Nuxeo Core, JCR 2, CMIS
Devoxx08 - Nuxeo Core, JCR 2, CMIS Nuxeo
 
Entity Framework Core & Micro-Orms with Asp.Net Core
Entity Framework Core & Micro-Orms with Asp.Net CoreEntity Framework Core & Micro-Orms with Asp.Net Core
Entity Framework Core & Micro-Orms with Asp.Net CoreStephane Belkheraz
 
Модерни езици за програмиране за JVM (2011)
Модерни езици за програмиране за JVM (2011)Модерни езици за програмиране за JVM (2011)
Модерни езици за програмиране за JVM (2011)Bozhidar Batsov
 
AST Transformations at JFokus
AST Transformations at JFokusAST Transformations at JFokus
AST Transformations at JFokusHamletDRC
 
Querydsl fin jug - june 2012
Querydsl   fin jug - june 2012Querydsl   fin jug - june 2012
Querydsl fin jug - june 2012Timo Westkämper
 
Doctrine MongoDB Object Document Mapper
Doctrine MongoDB Object Document MapperDoctrine MongoDB Object Document Mapper
Doctrine MongoDB Object Document MapperJonathan Wage
 
Ast transformations
Ast transformationsAst transformations
Ast transformationsHamletDRC
 
jQuery Datatables With MongDb
jQuery Datatables With MongDbjQuery Datatables With MongDb
jQuery Datatables With MongDbsliimohara
 

Semelhante a JPA2 - a brief intro (20)

Data access 2.0? Please welcome: Spring Data!
Data access 2.0? Please welcome: Spring Data!Data access 2.0? Please welcome: Spring Data!
Data access 2.0? Please welcome: Spring Data!
 
Link.javaLink.javapackage com.bookstore.domain.model;import .docx
Link.javaLink.javapackage com.bookstore.domain.model;import .docxLink.javaLink.javapackage com.bookstore.domain.model;import .docx
Link.javaLink.javapackage com.bookstore.domain.model;import .docx
 
Kick Start Jpa
Kick Start JpaKick Start Jpa
Kick Start Jpa
 
AST Transformations
AST TransformationsAST Transformations
AST Transformations
 
Terrastore - A document database for developers
Terrastore - A document database for developersTerrastore - A document database for developers
Terrastore - A document database for developers
 
Groovy Ast Transformations (greach)
Groovy Ast Transformations (greach)Groovy Ast Transformations (greach)
Groovy Ast Transformations (greach)
 
OrientDB introduction - NoSQL
OrientDB introduction - NoSQLOrientDB introduction - NoSQL
OrientDB introduction - NoSQL
 
Ast transformations
Ast transformationsAst transformations
Ast transformations
 
Developing and maintaining a Java GraphQL back-end: The less obvious - Bojan ...
Developing and maintaining a Java GraphQL back-end: The less obvious - Bojan ...Developing and maintaining a Java GraphQL back-end: The less obvious - Bojan ...
Developing and maintaining a Java GraphQL back-end: The less obvious - Bojan ...
 
An introduction into Spring Data
An introduction into Spring DataAn introduction into Spring Data
An introduction into Spring Data
 
Devoxx08 - Nuxeo Core, JCR 2, CMIS
Devoxx08 - Nuxeo Core, JCR 2, CMIS Devoxx08 - Nuxeo Core, JCR 2, CMIS
Devoxx08 - Nuxeo Core, JCR 2, CMIS
 
Spring data
Spring dataSpring data
Spring data
 
Entity Framework Core & Micro-Orms with Asp.Net Core
Entity Framework Core & Micro-Orms with Asp.Net CoreEntity Framework Core & Micro-Orms with Asp.Net Core
Entity Framework Core & Micro-Orms with Asp.Net Core
 
Модерни езици за програмиране за JVM (2011)
Модерни езици за програмиране за JVM (2011)Модерни езици за програмиране за JVM (2011)
Модерни езици за програмиране за JVM (2011)
 
JavaScript Neednt Hurt - JavaBin talk
JavaScript Neednt Hurt - JavaBin talkJavaScript Neednt Hurt - JavaBin talk
JavaScript Neednt Hurt - JavaBin talk
 
AST Transformations at JFokus
AST Transformations at JFokusAST Transformations at JFokus
AST Transformations at JFokus
 
Querydsl fin jug - june 2012
Querydsl   fin jug - june 2012Querydsl   fin jug - june 2012
Querydsl fin jug - june 2012
 
Doctrine MongoDB Object Document Mapper
Doctrine MongoDB Object Document MapperDoctrine MongoDB Object Document Mapper
Doctrine MongoDB Object Document Mapper
 
Ast transformations
Ast transformationsAst transformations
Ast transformations
 
jQuery Datatables With MongDb
jQuery Datatables With MongDbjQuery Datatables With MongDb
jQuery Datatables With MongDb
 

Mais de Tiziano Lattisi

ZoeFX: un framework MVC per JavaFX
ZoeFX: un framework MVC per JavaFXZoeFX: un framework MVC per JavaFX
ZoeFX: un framework MVC per JavaFXTiziano Lattisi
 
Groovy e Domain Specific Languages
Groovy e Domain Specific LanguagesGroovy e Domain Specific Languages
Groovy e Domain Specific LanguagesTiziano Lattisi
 
PyPaPi Qt Java Framework
PyPaPi Qt Java FrameworkPyPaPi Qt Java Framework
PyPaPi Qt Java FrameworkTiziano Lattisi
 

Mais de Tiziano Lattisi (6)

JugTAAS ReSTful
JugTAAS ReSTfulJugTAAS ReSTful
JugTAAS ReSTful
 
ZoeFX: un framework MVC per JavaFX
ZoeFX: un framework MVC per JavaFXZoeFX: un framework MVC per JavaFX
ZoeFX: un framework MVC per JavaFX
 
Groovy e Domain Specific Languages
Groovy e Domain Specific LanguagesGroovy e Domain Specific Languages
Groovy e Domain Specific Languages
 
JavaFX2: una panoramica
JavaFX2: una panoramicaJavaFX2: una panoramica
JavaFX2: una panoramica
 
VCS - DVCS - GIT-FLOW
VCS - DVCS - GIT-FLOWVCS - DVCS - GIT-FLOW
VCS - DVCS - GIT-FLOW
 
PyPaPi Qt Java Framework
PyPaPi Qt Java FrameworkPyPaPi Qt Java Framework
PyPaPi Qt Java Framework
 

JPA2 - a brief intro

  • 1. JPA2 BRIEF INTRO by Tiziano Lattisi mercoledì 13 febbraio 13
  • 2. WHAT IS JPA2 Java Persistence API JPA2 in Java EE 6 (JPA1 in Java EE 5) It’s a O/RM (Object Relational Mapping) Framework to provide persistence An object is a row in a master table (...) mercoledì 13 febbraio 13
  • 3. AND... annotation || XML descriptor (configuration by exception) POJO (Plain Old Java Object) based Outside container (no server required) No Bean interface required (no implements Serializable) Different persistence providers (Hibernate, EclipseLink, ...) mercoledì 13 febbraio 13
  • 4. CASE STUDY: LIBRARY The library contains several books The library can loan one or more books to a person Actors: Library, Book, Person, Loan mercoledì 13 febbraio 13
  • 5. O/RM public class Person { private Long id; PERSON private String name; PK ID private String surname; private Date birthday; ? NAME private Collection<Loan> loanCollection; SURNAME public Person() {} GENRE /* accessor methods */ } LOAN public class Loan { PK ID private Long id; FROMDATE private Date fromdate; private Date todate; TODATE private Person person; FK PERSON private Book book; FK BOOK public Loan(){ } } BOOK public class Book { PK ID private Long id; private String title; TITLE private String description; DESCRIPTION public Book(){ } GENRE } mercoledì 13 febbraio 13
  • 6. O/RM to map variables to database columns to handle data types between database and Java to map tables references in relationship between objects to manage the cycle of life of the object mercoledì 13 febbraio 13
  • 7. PERSISTENCE.XML <?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns:xsi="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http:// java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="DemoPU" transaction-type="RESOURCE_LOCAL"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <properties> <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:demo"/> <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/> <property name="javax.persistence.jdbc.user" value=""/> <property name="javax.persistence.jdbc.password" value=""/> <property name="eclipselink.ddl-generation" value="create-tables"/> </properties> <class>com.axiastudio.pypapi.demo.entities.Book</class> <class>com.axiastudio.pypapi.demo.entities.Loan</class> <class>com.axiastudio.pypapi.demo.entities.Person</class> </persistence-unit> </persistence> mercoledì 13 febbraio 13
  • 8. IDE HELPS US example: PU setup in Netbeans 7.2 IDE mercoledì 13 febbraio 13
  • 9. BY ANNOTATION @Entity @Table(name = "person") public class Person implements Serializable { @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name = "id") private Long id; @Column(name = "name") private String name; @Column(name = "surname") private String surname; @Column(name = "birthday") @Temporal(TemporalType.DATE) private Date birthday; @OneToMany(mappedBy = "person", orphanRemoval = true, cascade=CascadeType.ALL) private Collection<Loan> loanCollection; public Person() { } /* accessor methods */ } mercoledì 13 febbraio 13
  • 10. BY XML DESCRIPTOR <entity-mappings> ... <entity class="com.axiastudio.pypapi.demo.entities.Person" metadata-complete="true"> <table-name="PERSON"/> <attributes> <id name="id"/> <id name="name"/> <id name="surname"/> <id name="birthday"/> <id name="id"/> </attributes> </entity> </entity-mappings> mercoledì 13 febbraio 13
  • 11. SEQUENCE by annotation @SequenceGenerator(name="genBook", sequenceName="book.book_id_seq", initialValue=1, allocationSize=1) @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="genBook") private Long id; by descriptor <id name="id"> <generated-value strategy="SEQUENCE" generator="genBook"/> <sequence-generator name="genBook" sequence-name="book.book_id_seq"/> </id> mercoledì 13 febbraio 13
  • 12. INSERT import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import com.axiastudio.pypapi.demo.entities.Book; import com.axiastudio.pypapi.demo.entities.Genre; EntityManagerFactory emf = Persistence.createEntityManagerFactory("DemoPU"); em = emf.createEntityManager(); Book book = new Book(); book.setTitle("Dubliners"); book.setDescription("a collection of 15 short stories"); book.setGenre(Genre.ROMANCE); em.getTransaction().begin(); em.persist(book); em.getTransaction().commit(); mercoledì 13 febbraio 13
  • 13. SELECT CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Book> cq = cb.createQuery(Book.class); TypedQuery<Book> tq = em.createQuery(cq); List<Book> books = tq.getResultList(); for( Book book: books ){ switch (book.getDescription()) { case "Anna Karenina": assert "ROMANCE".equals(book.getGenre().toString()); break; case "Pro JPA": assert "REFERENCE".equals(book.getGenre().toString()); break; } } } mercoledì 13 febbraio 13
  • 14. SELECT (CRITERIA) CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Book> cq = cb.createQuery(Book.class); Root from = cq.from(Book.class); // from.get("description") Predicate predicate = cb.like(from.get(Book_.description), "%very%"); cq = cq.where(predicate); TypedQuery<Book> tq = em.createQuery(cq); List<Book> books = tq.getResultList(); assert books.size() == 1; assert "Anna Karenina".equals(books.get(0).getTitle()); Book book = tq.getSingleResult(); assert "Anna Karenina".equals(book.getTitle()); mercoledì 13 febbraio 13
  • 15. UPDATE CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Person> cq = cb.createQuery(Person.class); Root from = cq.from(Person.class); cq = cq.where(cb.and(cb.equal(from.get(Person_.name), "Tiziano"), cb.equal(from.get(Person_.surname), "Lattisi"))); TypedQuery<Person> tq = em.createQuery(cq); Person person = tq.getSingleResult(); assert "Tiziano".equals(person.getName()); assert person.getEmail() == null; Long key = person.getId(); person.setEmail("tiziano.lattisi@gmail.com"); Person personByKey = em.find(Person.class, key); assert "tiziano.lattisi@gmail.com".equals(personByKey.getEmail()); em.detach(person); person = em.find(Person.class, key); assert ! "tiziano.lattisi@gmail.com".equals(person.getEmail()); person.setEmail("tiziano.lattisi@gmail.com"); em.getTransaction().begin(); em.merge(person); em.getTransaction().commit(); Person personByKey2 = em.find(Person.class, key); assert "tiziano.lattisi@gmail.com".equals(personByKey2.getEmail()); mercoledì 13 febbraio 13
  • 16. DELETE Person person = new Person(); person("Tiziano"); person("Lattisi"); em.getTransaction().begin(); em.persist(person); em.getTransaction().commit(); Long aPrimaryKey = person.getId(); [...] Person person = em.find(Person.class, aPrimaryKey); em.getTransaction().begin(); em.remove(person); em.getTransaction().commit(); person = em.find(Person.class, aPrimaryKey); assert person == null; mercoledì 13 febbraio 13
  • 17. AND NOW... Thank you. Tiziano Lattisi Me: http://www.linkedin.com/in/tizianolattisi/ Slides: http://www.slideshare.net/lattisi/ Examples: http://tinyurl.com/crn3wwq mercoledì 13 febbraio 13