17
JPA2 BRIEF INTRO by Tiziano Lattisi mercoledì 13 febbraio 13

JPA2 - a brief intro

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: JPA2 - a brief intro

JPA2 BRIEF INTROby Tiziano Lattisi

mercoledì 13 febbraio 13

Page 2: JPA2 - a brief intro

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

Page 3: JPA2 - a brief intro

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

Page 4: JPA2 - a brief intro

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

Page 5: JPA2 - a brief intro

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

Page 6: JPA2 - a brief intro

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

Page 7: JPA2 - a brief intro

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

Page 8: JPA2 - a brief intro

IDE HELPS US

example:

PU setup in Netbeans 7.2 IDE

mercoledì 13 febbraio 13

Page 9: JPA2 - a brief intro

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

Page 10: JPA2 - a brief intro

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

Page 11: JPA2 - a brief intro

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

Page 12: JPA2 - a brief intro

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

Page 13: JPA2 - a brief intro

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

Page 14: JPA2 - a brief intro

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

Page 15: JPA2 - a brief intro

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

Page 16: JPA2 - a brief intro

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