SlideShare a Scribd company logo
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

More Related Content

PDF
Using Templates to Achieve Awesomer Architecture
PDF
Cleaner, Leaner, Meaner: Refactoring your jQuery
PDF
Functionality Focused Code Organization
PPTX
Object oriented javascript
PPT
PDF
NOSQL part of the SpringOne 2GX 2010 keynote
PDF
Ext GWT 3.0 Theming and Appearances
Using Templates to Achieve Awesomer Architecture
Cleaner, Leaner, Meaner: Refactoring your jQuery
Functionality Focused Code Organization
Object oriented javascript
NOSQL part of the SpringOne 2GX 2010 keynote
Ext GWT 3.0 Theming and Appearances

What's hot (18)

PDF
Java e i database: da JDBC a JPA
PDF
Building Sencha Themes
PDF
OOCSS for JavaScript Pirates jQcon Boston
PDF
Active domain
PDF
2013-03-23 - NoSQL Spartakiade
PDF
Transparent Object Persistence with FLOW3
DOC
Email Program By Marcelo
PDF
Transparent Object Persistence with FLOW3
PDF
Delivering a Responsive UI
ZIP
OOCSS for Javascript pirates at jQueryPgh meetup
PDF
Slides python elixir
PPTX
Jpa queries
PDF
Core (Data Model) of WordPress Core
PPTX
Apache Cassandra Ignite Presentation
PDF
Using UIBinder with Ext GWT 3.0
PPTX
Chapter ii(oop)
PDF
Snapshot Testing @ CocoaheadsNL
Java e i database: da JDBC a JPA
Building Sencha Themes
OOCSS for JavaScript Pirates jQcon Boston
Active domain
2013-03-23 - NoSQL Spartakiade
Transparent Object Persistence with FLOW3
Email Program By Marcelo
Transparent Object Persistence with FLOW3
Delivering a Responsive UI
OOCSS for Javascript pirates at jQueryPgh meetup
Slides python elixir
Jpa queries
Core (Data Model) of WordPress Core
Apache Cassandra Ignite Presentation
Using UIBinder with Ext GWT 3.0
Chapter ii(oop)
Snapshot Testing @ CocoaheadsNL
Ad

Viewers also liked (9)

PPTX
Presentación1
PPT
Evolución de las tecnologías educativas
PPTX
Presentacion diapocitiva
PPT
Origen y evolución de le te
PPTX
Exp. de teleformacion y aula virtual
DOCX
Origen de la tecnología educativa
PPT
Esquema Origen y Evolución de le Tecnologia Educativa
DOCX
Avances tecnológicos en Educación
PPTX
Evolucion de las tecnologias educativas
Presentación1
Evolución de las tecnologías educativas
Presentacion diapocitiva
Origen y evolución de le te
Exp. de teleformacion y aula virtual
Origen de la tecnología educativa
Esquema Origen y Evolución de le Tecnologia Educativa
Avances tecnológicos en Educación
Evolucion de las tecnologias educativas
Ad

Similar to JPA2 - a brief intro (20)

PDF
S313431 JPA 2.0 Overview
PDF
Using the latest Java Persistence API 2 Features - Tech Days 2010 India
PDF
Java Persistence API 2.0: An Overview
PPT
Spring data
PDF
Kick Start Jpa
PDF
Ejb3 Struts Tutorial En
PDF
Ejb3 Struts Tutorial En
PDF
PPT
Persisting Your Objects In The Database World @ AlphaCSP Professional OSS Con...
PDF
Java Persistence API
PDF
How to survive in a BASE world
PDF
JPA and Hibernate
PDF
Lecture 9 - Java Persistence, JPA 2
PDF
2014 Pre-MSc-IS-3 Persistence Layer
PPTX
The Evolution of Java Persistence
PDF
Mapping Java Objects with JPA
PDF
StORM preview
PDF
Building DSLs With Eclipse
PDF
Next Generation Model Query
PDF
2011 JavaOne EJB with Meta Annotations
S313431 JPA 2.0 Overview
Using the latest Java Persistence API 2 Features - Tech Days 2010 India
Java Persistence API 2.0: An Overview
Spring data
Kick Start Jpa
Ejb3 Struts Tutorial En
Ejb3 Struts Tutorial En
Persisting Your Objects In The Database World @ AlphaCSP Professional OSS Con...
Java Persistence API
How to survive in a BASE world
JPA and Hibernate
Lecture 9 - Java Persistence, JPA 2
2014 Pre-MSc-IS-3 Persistence Layer
The Evolution of Java Persistence
Mapping Java Objects with JPA
StORM preview
Building DSLs With Eclipse
Next Generation Model Query
2011 JavaOne EJB with Meta Annotations

More from Tiziano Lattisi (6)

PDF
JugTAAS ReSTful
PDF
ZoeFX: un framework MVC per JavaFX
PDF
Groovy e Domain Specific Languages
PDF
JavaFX2: una panoramica
PDF
VCS - DVCS - GIT-FLOW
PPT
PyPaPi Qt Java Framework
JugTAAS ReSTful
ZoeFX: un framework MVC per JavaFX
Groovy e Domain Specific Languages
JavaFX2: una panoramica
VCS - DVCS - GIT-FLOW
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