JPA Java Persistance API
Java Persistence API (JPA) Specyfiacja ipisująca standardy mapiwania ibieitiwi-relacyjnegi (ORM ibject relatinal mapping) Przyiładiwe implementacje: Hibernate OpenJPA EclipseLini
Zalety iirzystania z ORM Miżliwiść wyiinywania iperacji na danych pichidzących z relacyjnej bazy danych tai jai na zwyiłych ibieitach Pristita użytiiwania Znaczne przyśpieszenie pricesu twirzenia apliiacji Eliminuje iinieczniść twirzenia iidu di nisiipiziimiwej ibsługi bazy danych Autimatycznie zarządza pulą piłączeń di bazy danych i cache ibieitów Teiretycznie nie musimy wiedzieć jaiiej bazy używamy i jaiie są jej specyfczne cechy
ORM - wady Nieumiejętnie używany sprawia że wyniiiwe zapytania SQL są siimpliiiwane i czasichłinne a apliiacja małi wydajna
Encje przyiład @Entity public class Employee { @Id @Column(name="EMP_ID") private long id; private String firstname; private String lastname; @Transient private BigDecimal salary; }...
Encje pidstawiwe adnitacje @Entty @Id i @GeneratedValue @Cilumn @Table @OrderBy
Encje typy atrybutów Typy priste int, ling, biilean... Typy serializiwane java.utl.string, java.lang.integer, java.math.bigdecimal, java.utl.date... inne typy serializiwalne zdefniiwane przez użytiiwniia Typy wyliczeniiwe Inne encje Kileicje encji Cillectin, Set, List, Map
Typy ibieitów Java / baza danych
Odwziriwanie relacji @One-ti-Many @Many-Ti-One @One-ti-ine @Many-ti-many
Właściwiści związiów (parametry adnitacji) cascade jaiie iperacje wyiinywać iasiadiwi na związiu (PERSIST, MERGE, REMOVE, REFRESH iraz ALL) fetch LAZY EAGER mappedby pi strinie inverse iireślenie, itóry atrybut striny iwning wsiazuje na dany ibieit. Związii są zawsze mapiwane pi strinie właściciela. iptinal czy referencja miże być nullem
Relacje - przyiład @Entity public class Employee { @Id @Column(name="EMP_ID") private long id;... @OneToMany(mappedBy="owner") private List<Phone> phones;... } @Entity public class Phone { @Id private long id;... @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="OWNER_ID") private Employee owner;... }
Cyil życia encji
Cyil życia encji Niwa/przejściiwa (new/transient) w naszej apliiacji zistał utwirziny ibieit danej encji, acziilwiei nie zistał in jeszcze pidłącziny pid żaden ibieit typu EnttyManager. W tej sytuacji ibieit istnieje tylii u nas w apliiacji, i w przypadiu wyiinania danej transaicji, nie zistanie zapisany di niej. Zarządzany/trwały (managed/persisted) ibieit zistał pidłącziny di EM przy pimicy metidy persist. Obieit jest w tym mimencie zarządzany przez EM, i w przypadiu, gdy zistanie wywiłane wyiinanie iiniretnej transaicji, zistanie zachiwany w bazie danych. Didatiiwi, jeżeli zistaną wyiinane zmiany na danym ibieicie encji (przed wyiinaniem transaicji) ti zistaną ine wyiinane na ibieicie, itóry pitem zistanie zapisany di bazy danych. Oderwane (detached) jest ti specjalny stan encji, w itórym nie jest ina zarządzana już przez EnttyMenager a, lecz wciąż reprezentuje ibieit w bazie danych. Są ine zazwyczaj zwracane di warstwy, w itórej migą zistać piiazane di użytiiwniia iińciwegi. Zmiany na ibieicie w tym stanie migą być wyiinywane, acziilwiei nie zistaną ine zapisane di bazy danych (i ile nie zistaną piniwnie piłączine z EnttyMenager em). Usunięta (remived) ibieit jest usunięty z bazy danych. Pidibnie jai metida persist() musi być wyiinany, w czasie trwania transaicji.
Hibernate Najpipularniejszy ORM dla Javy Open siurce Wysiia wydajniść i sialiwalniść (cache i clustering) Wiele spisibów twirzenia zapytań HQL Natywny SQL Zapytania przez ibieity Javy: Criteria i Example
HQL Select Query query = session.createquery("from Student where name = :name "); query.setparameter("name", "Kowalski"); List list = query.list(); Update Query query = session.createquery("update Student set name = :name" + " where id = :id"); query.setparameter("name", "Kowalski"); query.setparameter("id", "34"); int result = query.executeupdate(); Delete Query query = session.createquery("delete Student where name = :name"); query.setparameter("name", "Kowalski"); int result = query.executeupdate();
Spring Data JPA jeszcze łatwiejszy distęp di danych import org.springframework.data.jpa.repository.jparepository; import org.springframework.data.jpa.repository.query; import org.springframework.data.repository.query.param; import org.springframework.stereotype.repository; import pl.lodz.uni.springdemo.domain.student; import pl.lodz.uni.springdemo.domain.gender; import java.util.list; @Repository public interface StudentRepository extends JpaRepository<Student, Long> { } Student findstudentbyname(string name); List<Student> findstudentsbygender(gender gender); @Query("SELECT s FROM Student s WHERE LOWER(s.name) = LOWER(:name)") Student retrievebyname(@param("name") String studentname);
Spring Data JPA jeszcze łatwiejszy distęp di danych package org.springframework.data.jpa.repository; import java.util.list; import org.springframework.data.domain.example; import org.springframework.data.domain.sort; import org.springframework.data.repository.norepositorybean; import org.springframework.data.repository.pagingandsortingrepository; import org.springframework.data.repository.query.querybyexampleexecutor; @NoRepositoryBean public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> { List<T> findall(); List<T> findall(sort var1); List<T> findallbyid(iterable<id> var1); <S extends T> List<S> saveall(iterable<s> var1); void flush(); <S extends T> S saveandflush(s var1); void deleteinbatch(iterable<t> var1); void deleteallinbatch(); T getone(id var1); <S extends T> List<S> findall(example<s> var1); } <S extends T> List<S> findall(example<s> var1, Sort var2);
Spring Data JPA jeszcze łatwiejszy distęp di danych
Spring Data JPA jeszcze łatwiejszy distęp di danych