JPA2 BRIEF INTROby 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
PERSONPERSONPK ID
NAMESURNAMEGENRE
public class Person { private String name; private String surname; private Date birthday;
public Person() {} /* accessor methods */}
public class Loan { private Date fromdate; private Date todate;
public Loan(){ }}
public class Book { private String title; private String description;
public Book(){ }}
LOANLOANPK ID
FROMDATETODATE
BOOKBOOKPK ID
TITLEDESCRIPTIONGENRE
?private Long id;
private Long id;
private Long id;
private Collection<Loan> loanCollection;
private Person person;private Book book;
FK PERSONFK BOOK
mercoledì 13 febbraio 13
O/RM
to manage the cycle of life of the object
to map variables to database columns
to map tables references in relationship between objects
to handle data types between database and Java
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
public class Person {
private Long id;
private String name;
private String surname;
private Date birthday;
private Collection<Loan> loanCollection;
public Person() { } /* accessor methods */}
@Table(name = "person") implements Serializable
@GeneratedValue(strategy=GenerationType.AUTO) @Column(name = "id")
@Column(name = "name")
@Column(name = "surname")
@Column(name = "birthday")
@Entity
@Id
@Temporal(TemporalType.DATE)
@OneToMany(mappedBy = "person", orphanRemoval = true, cascade=CascadeType.ALL)
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
@SequenceGenerator(name="genBook", sequenceName="book.book_id_seq", initialValue=1, allocationSize=1)
@Id@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="genBook")private Long id;
<id name="id"> <generated-value strategy="SEQUENCE" generator="genBook"/> <sequence-generator name="genBook" sequence-name="book.book_id_seq"/></id>
by annotation
by descriptor
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
UPDATECriteriaBuilder 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("[email protected]");
Person personByKey = em.find(Person.class, key);assert "[email protected]".equals(personByKey.getEmail()); em.detach(person);person = em.find(Person.class, key);assert ! "[email protected]".equals(person.getEmail()); person.setEmail("[email protected]");em.getTransaction().begin(); em.merge(person); em.getTransaction().commit();Person personByKey2 = em.find(Person.class, key);assert "[email protected]".equals(personByKey2.getEmail());
mercoledì 13 febbraio 13
DELETEPerson 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