´ ak ´ – 11. eload ˝ as ´ Java technologi Perzisztencia ANTAL Margit Sapientia - EMTE
2010
ANTAL Margit
´ ak ´ – Java technologi
˝ as ´ 11. eload
Perzisztencia
˝ as ´ celja ´ Az eload
JPA – Java Persistence API ORM – Object Relational Mapping ´ ¨ otti ¨ asszociaci ´ ok ´ megvalos´ ´ ıtasa ´ Entitasok koz Fontosabb fogalmak ´ o´ (Persistence Provider) perzisztencia szolgaltat ´ (Persistence Unit) perzisztencia egyseg ´ manager (Entity Manager) entitas ´ (Entity) entitas perzisztencia kontextus (Persistence Context)
ANTAL Margit
´ ak ´ – Java technologi
˝ as ´ 11. eload
Perzisztencia
Perzisztencia
´ ´ ag. ´ Alland os ´ az alkalmazas ´ adatai Mechanizmus, amely soran ˝ esre ´ ´ oban. ´ megorz kerulnek valamely perzisztens tarol ¨ ´ o: ´ pl. adatbazis. ´ Perzisztens tarol
ANTAL Margit
´ ak ´ – Java technologi
˝ as ´ 11. eload
Perzisztencia
Java Persistence API
´ o, ´ amelyet minden alkalmazasszervernek ´ Egy specifikaci ¨ ´ kotelez o˝ implementalni. ´ ´ Hasznalhat o´ alkalmazasszerveren k´ıvul ¨ is. ´ ´ Osztalyoz as: CMP – Container Managed Persistence AMP – Application Managed Persistence
ANTAL Margit
´ ak ´ – Java technologi
˝ as ´ 11. eload
Perzisztencia
ORM
´ ´ enek ´ ¨ oz ¨ os ˝ ege ´ Problema: az adatok szervezes kul ¨ onb ´ objektumok Alkalmazas: ´ ´ os ´ tabl ´ ak ´ Adatbazis: relaci
´ ORM (Object Relational Mapping) software Megoldas: ´ o, ´ Persistence provider) (JPA implementaci Oracle Toplink, Hibernate, Kodo, Open JPA, ...
ANTAL Margit
´ ak ´ – Java technologi
˝ as ´ 11. eload
Perzisztencia
´ lehetos ˝ egek ´ Fejlesztesi
top-down: Java Domain Objects ⇒ Database Schema; ´ ok ´ vagy XML konfiguraci ´ os ´ fajl ´ annotaci bottom-up: Database Schema + Data Model ⇒ Java Domain Objects; Reverse Engineering
ANTAL Margit
´ ak ´ – Java technologi
˝ as ´ 11. eload
Perzisztencia
´ ok ´ Annotaci
´ o´ = Forrask ´ odba ´ Annotaci illesztett metaadat, amely ´ ¨ oz ¨ o˝ eszkoz ¨ ok ¨ es ´ befolyasolja, hogy kul ¨ onb ´ onyvt ¨ ´ ´ azt. osztalyk arak, hogyan kezeljek ´ Leggyakrabban osztalyhoz, attributumhoz vagy ´ ´ metodushoz rendeljuk. ¨ Szintaxis ´ oNeve(param ´ ´ ´ ek1, ´ ´ ´ ek2... ´ @Annotaci eter1= ert parameter2= ert )
ANTAL Margit
´ ak ´ – Java technologi
˝ as ´ 11. eload
Perzisztencia
´ ok ´ es ´ a Java EE Annotaci
´ okat ´ ´ ´ ´ Az annotaci az alkalmazasszerver ertelmezi es ´ figyelembe veszi a komponensek telep´ıtesekor. ´ ok ´ atveszik ´ ´ ırok ´ (XML: web.xml ) Az annotaci a telep´ıtesle´ ´ amennyiben vegyesen hasznaljuk, ´ ´ szerepet, felul´ ¨ ırjak azokat.
ANTAL Margit
´ ak ´ – Java technologi
˝ as ´ 11. eload
Perzisztencia
´ o´ – pelda ´ Annotaci
˝ ´ eler ´ ese ´ ´ Eroforr as - Nem kell kodot ´ırni public class SomeClass{
@Resource(name="jdbc/distedudb") private javax.sql.DataSource datasource; ... }
ANTAL Margit
´ ak ´ – Java technologi
˝ as ´ 11. eload
Perzisztencia
´ ´ Entitasoszt aly ´ Entitas ´ amelynek peld ´ anyai ´ Olyan osztaly, perzisztensek. @Entity public class Customer implements Serializable{ @Id protected Long id; protected String name; protected Address address; protected PreferredStatus status; @Transient protected int orderCount; public Customer() {} ... } ANTAL Margit
´ ak ´ – Java technologi
˝ as ´ 11. eload
Perzisztencia
´ ´ – megkot ¨ esek ´ Entitasoszt aly
´ publikus, az osztaly az attributumok nem publikusak, ´ ´ ´ at ´ akarom adni (tavoli ´ ´ ha parameterk ent interfesz) akkor ´ ´ szerializalhat o, ˝ ´ kell: elsodleges kulcsnak megfelelo˝ attributumot annotalni ´ @Id, ´ uli public vagy protected argumentum nelk ¨ konstruktor.
ANTAL Margit
´ ak ´ – Java technologi
˝ as ´ 11. eload
Perzisztencia
˝ Elsodleges kulcs
´ ´ os ´ adatbazisra ´ Minden entitasnak, amit relaci akarunk ´ ˝ lekepezni, rendelkeznie kell elsodleges kulccsal. ˝ ´ a kovetkez ¨ ´ ´ Elsodleges kulcskent o˝ t´ıpusok hasznalhat ok: Primit´ıv t´ıpusok: byte, int, short, long, char ´ Primit´ıv t´ıpusok burkolo´ osztalyai: Byte, Integer, Short, Long, Character ´ ¨ Primit´ıv t´ıpusok vagy azok burkolo´ osztalyainak tombje: byte[], int[], short[], long[], char[], Byte[], Integer[], Short[], Long[], Character[] ¨ Szoveges t´ıpusok: String ´ numerikus t´ıpusok: java.math.BigInteger Specialis ´ Datumok: java.util.Date, java.sql.Date
ANTAL Margit
´ ak ´ – Java technologi
˝ as ´ 11. eload
Perzisztencia
´ ´ es ´ Alapertelmezett lekepz
´ ´ ⇒ tabla ´ Entitasoszt aly ´ ´ attributuma ˝ Entitasoszt aly ⇒ oszlop (mezo) ´ ´ ´ peld ´ anya ´ Entitasoszt aly ⇒ sor (rekord) ´ okkal ´ Annotaci felul´ ¨ ırhato´ @Table(name="CUST") public class Client{ @Column(name="cname") private String clientName; ... }
ANTAL Margit
´ ak ´ – Java technologi
˝ as ´ 11. eload
Perzisztencia
˝ ´ as ´ Elsodleges kulcsgeneral
@Entity @Table( name = "CUST") public class Client{ @Id @GeneratedValue(strategy=GenerationType.AUTO) private int clientReference; //... }
ANTAL Margit
´ ak ´ – Java technologi
˝ as ´ 11. eload
Perzisztencia
´ ´ es ´ felul´ ´ Alapertelmezett lekepz ¨ ırasa
@Entity @Table(name="CUST") public class Customer{ @Transient private int notPersistent; //.. @Column(name=cname) private String clientName; //... }
ANTAL Margit
´ ak ´ – Java technologi
˝ as ´ 11. eload
Perzisztencia
´ ¨ ott ¨ Kapcsolatok entitasok koz
´ ´ Osztalyoz as: ´ ´ Kapcsolat szamoss aga: egy-az-egyhez sok-az-egyhez egy-a-sokhoz sok-a-sokhoz
´ ıtottsaga: ´ Kapcsolat irany´ ´ u´ egyirany ´ any ´ u´ ketir
ANTAL Margit
´ ak ´ – Java technologi
˝ as ´ 11. eload
Perzisztencia
´ u, Egyirany ´ egy az egyhez kapcsolat Customer → Record @Entity public class Customer{ @Id private int id; @OneToOne private Record custRecord; //... } @Entity public class Record{ @Id private int recId; //... } ANTAL Margit
´ ak ´ – Java technologi
˝ as ´ 11. eload
Perzisztencia
´ any ´ u, Ketir ´ egy-az-egyhez kapcsolat Customer ↔ Record @Entity public class Customer{ @Id private int id; @OneToOne private Record custRecord; //... } @Entity public class Record{ @Id private int recId; @OneToOne(mappedBy="custRecord") private Customer customer; //... } ANTAL Margit
´ ak ´ – Java technologi
˝ as ´ 11. eload
Perzisztencia
´ any ´ u) Egy-az-egyhez kapcsolat (egy, illetve ketir ´
ANTAL Margit
´ ak ´ – Java technologi
˝ as ´ 11. eload
Perzisztencia
´ any ´ u´ egy-a-sokhoz, illetve sok-az-egyhez Ketir kapcsolat Customer ↔ Order @Entity public class Customer{ @Id private int id; @OneToMany(mappedBy="customer") private Collection
orders; //... } @Entity public class Order{ @Id private int orderId; @ManyToOne private Customer customer; //... } ANTAL Margit
´ ak ´ – Java technologi
˝ as ´ 11. eload
Perzisztencia
Egy-a-sokhoz kapcsolat
ANTAL Margit
´ ak ´ – Java technologi
˝ as ´ 11. eload
Perzisztencia
´ any ´ u´ sok-a-sokhoz kapcsolat Ketir Worker ↔ Project @Entity public class Worker{ @Id private int id; @ManyToMany private Collection projects; //... } @Entity public class Project{ @Id private int pId; @ManyToMany(mappedBy="projects") private Collection<Worker> workers; //... } ANTAL Margit
´ ak ´ – Java technologi
˝ as ´ 11. eload
Perzisztencia
Sok-a-sokhoz kapcsolat
ANTAL Margit
´ ak ´ – Java technologi
˝ as ´ 11. eload
Perzisztencia
Alapfogalmak ´ ´ Entity life-cycle states – eletciklusallapotok: ´ uj rekord ´ – new – nincs hozzarendelt ´ az menedzselt – managed – szinkronban van az entitas ´ adatbazis rekorddal ´ az lecsatolt - detached – nincs szinkronban az entitas ´ adatbazis rekorddal ¨ olt ¨ - removed - az adattabla ´ tor megfelelo˝ rekordja ki fog ¨ odni ˝ torl
Entity manager: az az objektum, amely kezeli az ´ ´ ezek eletciklus ´ ´ entitasobjektumokat, vezerli at ´ Persistence context: egyedi entitasok halmaza ´ ek, ´ amely az entitas ´ Persistence identity: egy egyedi ert ´ ara ´ szolgal. ´ Egy entitas ´ objektum ⇒ egy rekord azonos´ıtas
ANTAL Margit
´ ak ´ – Java technologi
˝ as ´ 11. eload
Perzisztencia
EntityManager muveletek ˝ persist() merge() remove() find()
ANTAL Margit
´ ak ´ – Java technologi
˝ as ´ 11. eload
Perzisztencia
JPQL – JPA SQL SELECT [] [FROM ] [WHERE ] [GROUP BY ] [HAVING ] [ORDER BY ] ´ 1. pelda SELECT p FROM Person WHERE p.city.id IN ("SF","NY", "FS") ´ 2. pelda Named Parameters : Query q = em.createQuery("SELECT p FROM Person p WHERE p.lastName = :surname AND o.firstName = :forename"); q.setParameter("surname", theSurname); q.setParameter("forename", theForename"); Numbered Parameters : Query q = em.createQuery("SELECT p FROM Person p WHERE p.lastName = ?1 AND p.firstName = ?2"); q.setParameter(1, theSurname); q.setParameter(2, theForename); ANTAL Margit
´ ak ´ – Java technologi
˝ as ´ 11. eload
Perzisztencia