IŠ PRAEITOS PASKAITOS JpaRepository API yra User[Entity] tik aplinkiniai sluoksniai, DB (tiksliau Entity Manager šiuo atveju) arba servisas, gali keis

Panašūs dokumentai
IŠ PRAEITOS PASKAITOS - anotacija leidžia nerašyti get/set metodų Norint, kad neraudonuotų sakiniai IDE, reikia atsisiųsti lombok.jar fai

Java esminės klasės, 1 dalis Išimtys, Įvestis/išvestis

DB sukūrimas ir užpildymas duomenimis

Microsoft Word - 15_paskaita.doc

Administravimo vadovas SAFTit Pro v3

Pardavimų aplikacija (Microsoft Dynamics AX (Axapta) sistemai) Diegimo instrukcija bifree.lt qlik.com

EUROPOS KOMISIJA Briuselis, C(2017) 4679 final KOMISIJOS ĮGYVENDINIMO SPRENDIMAS (ES) / dėl bendros sistemos techninių standa

MAGENTO 1.9 OMNIVA MODULIO DIEGIMO INSTRUKCIJA

VALSTYBINIO SOCIALINIO DRAUDIMO FONDO VALDYBOS

PS Testavimo ir konfigūravimo valdymas Užduotis nr. 1. Karolis Brazauskas Mindaugas Rekevičius Jonas Riliškis Eugenijus Sabaliauskas

Automatinis skolinimas Automatinio skolinimo paslauga automatiškai teikia pasiūlymus paskolų prašymams pagal Jūsų pasirinkto portfelio rinkinio nustat

Longse Wi-Fi kameros greito paleidimo instrukcija 1. Jums prireiks 1.1. Longse Wi-Fi kameros 1.2. Vaizdo stebėjimo kameros maitinimo šaltinio 1.3. UTP

Slide 1

Sistemos specifikacija

MUITINĖS DEPARTAMENTAS PRIE LIETUVOS RESPUBLIKOS FINANSŲ MINISTERIJOS BENDRO NAUDOTOJŲ VALDYMO SISTEMOS, ATITINKANČIOS EUROPOS KOMISIJOS REIKALAVIMUS,

Cloud_sprendimu_salygos.pdf

Dažniausios IT VBE klaidos

PATVIRTINTA Kauno sporto mokyklos Startas Direktoriaus 2019 m. balandžio 23 d. įsakymu Nr KAUNO SPORTO MOKYKLOS STARTAS PRIVATUMO POLITIKA Kauno

Pagrindiniai algoritmai dirbant su sveikųjų ir realiųjų skaičių masyvų reikšmėmis Sumos skaičiavimo algoritmas Sveikieji skaičiai int Suma (int X[], i

P. Kasparaitis. Praktinė informatika. Skriptų vykdymas ir duomenų valdymas Skriptų vykdymas ir duomenų valdymas Įvadas Skripto failas tai M

Microsoft Word ESMA CFD Renewal Decision (2) Notice_LT

Tiesioginio-debeto-paslaugos-duomenu-apsikeitimo-formatu-aprasas

PRESTASHOP 1.7 OMNIVA MODULIO DIEGIMO INSTRUKCIJA

Techninė dokumentacija Qlik Sense architektūros apžvalga 2015 m. gruodis qlik.com

K9 WebProtection (toliau K9) programa yra nemokama asmeniniam naudojimui. Programa suderinama su Windows Vista, Windows 7, Windows 10 ir Mac operacinė

AAA.AIEPI.Mokymu_medziaga_MOK_VI_07.Vandens_inventorizacijos_duomenu_tvarkymas.v.0.4

DBVS realizavimas Pagrindiniai DBVS komponentai Duomenų saugojimas diske Paruošė J.Skučas

File Transfer programinės įrangos naudotojo instrukcija

Atviro konkurso sąlygų 4 priedas BENDROJO PAGALBOS CENTRO INFORMACINĖS SISTEMOS APTARNAVIMO PASLAUGŲ TEIKIMO SPECIFIKACIJA 1. Pirkimo objektas Bendroj

Pridėtinės vertės mokesčio sąskaitų faktūrų registrų duomenų tvarkymo ir pateikimo taisyklių priedas I.SAF DUOMENŲ RINKMENOS APRAŠYMAS I DALIS ANTRAŠT

Microsoft PowerPoint - IOSrautai.ppt

Individualus projektas Programa TE-PM, TE-PS, TE-SL, TEstream 4, TEstream 6, TEstream 8, TEstreamOBD 4, TEstreamOBD 6, TEstreamOBD 8 sistemų naudotoja

Muzikos duomenų bazės NAXOS Music Library naudojimo vadovas Turinys Kas yra NAXOS Music Library... 2 Kaip pradėti naudotis... 3 Kaip atlikti paiešką..

UAB AMEA Business Solutions Praktiniai IT Sprendimai smulkioms ir vidutin ms mon ms Direktor, Jurgita Vitkauskait , K

Masyvas su C++ Užduotys. Išsiaiškinkite kodą (jei reikia pataisykite) ir paleiskite per programą. Ciklo skaitliuko įrašymas į vienmatį masyvą: #includ

EUROPOS KOMISIJA Briuselis, C(2012) 2384 final KOMISIJOS ĮGYVENDINIMO SPRENDIMAS kuriuo priimamas valstybių narių teikiamų Europ

CompoundJS Node on rails

UAB VALENTIS PRIVATUMO POLITIKA Uždaroji akcinė bendrovė Valentis (toliau Valentis arba mes), įgyvendindama 2016 m. balandžio 27 d. Europos Parlamento

PowerPoint Presentation

PowerPoint Presentation

DIGIPASS DP 260 VARTOTOJO INSTRUKCIJA

Style Sample for C&N Word Style Sheet

Programų sistemų inžinerija Saulius Ragaišis, VU MIF

Slide 1

VARTOTOJO INSTRUKCIJA Daikin Altherma Žemos temperatūros "Split" šilumos siurblys

Jūsų duomenys, jūsų teisės. Ericsson duomenų tvarkytojo įmonei privalomos duomenų apsaugos taisyklės Įžanga Ericsson veikla pasižymi sąžiningumu, skai

Microsoft Word - Techninis biuletenis.doc

AB FREDA

KTU BIBLIOTEKOS PASLAUGOS

Sutartis aktuali nuo

AB FREDA

4 skyrius Algoritmai grafuose 4.1. Grafų teorijos uždaviniai Grafai Tegul turime viršūnių aibę V = { v 1,v 2,...,v N } (angl. vertex) ir briaun

Lietuvos mokslo ir studijų institucijų kompiuterių tinklas LITNET Vilniaus universitetas Mokslininko darbo vietos paslauga Paslaugos naudojimo instruk

Slaptažodžių generatoriaus naudojimo instrukcija Slaptažodžių generatorius tai aukščiausius saugumo reikalavimus atitinkantis įrenginys, kuris generuo

LT.doc

EDUKA DIENYNO IR EDUKA KLASĖS INTEGRACIJA KAIP NAUDOTIS EDUKA KLASĖS IR DIENYNO INTEGRACIJA?... 2 Kaip prisijungti prie EDUKA klasės?... 2 Kaip įkelti

Hexagonal Architecture with Ruby on Rails - Šiašiakampe architektura su Ruby on Rails

Microsoft Word - AUTOSERVISO MODULIS

PATVIRTINTA UAB Jonavos vandenys direktoriaus 2018 m. spalio mėn. 04 d. Įsakymu Nr. V-16 UAB JONAVOS VANDENYS VAIZDO DUOMENŲ TVARKYMO TAISYKLĖS I SKYR

RR-GSM_IM_LT_110125

MES PAKEISIME JŪSŲ GYVENIMO KOKYBĘ ASV-P balansinis ventilis su 1.5 m impulsiniu vamzdeliu (G1/16 A) ir dreno čiaupu (G 3/4 A) Pastovus slėgio perkryt

LMTA prenumeruojamos duomenų bazės

Slide 1

JABRA REVO WIRELESS Naudotojo Vadovas jabra.com/revowireless

Microsoft Word - CP v3.0.doc

CE ATITIKTIES DEKLARACIJA Gamintojas arba jo įgaliotas atstovas Europos Sąjungoje: BASE PROTECTION SRL, oficiali būstinė adresu Via dell'unione Europe

LIETUVOS RESPUBLIKOS VALSTYBINIO PATENTŲ BIURO DIREKTORIAUS

Slide 1

ASMENS DUOMENŲ APSAUGA I. BENDROSIOS NUOSTATOS 1. Taisyklės reglamentuoja Bendrovės ir jos darbuotojų veiksmus, tvarkant Asmens duomenis, naudojant Be

Specialiosios_SoyouStart_dedikuoto_serverio_nuomos_sutarties_salygos

VĮ GIS-Centras Vilnius 2019 Palydovinių duomenų peržiūros ir analizės paslauga Naudotojo vadovas v.1

Microsoft Word - Paslauga _leidimai išvezti iš LR_ Į-29 AP-15.doc

PowerPoint Presentation

Neiškiliojo optimizavimo algoritmas su nauju bikriteriniu potencialiųjų simpleksų išrinkimu naudojant Lipšico konstantos įvertį

Kliento anketa JA - DNB Trade [ ]

airbnb-pwc-taxguide-lithuania-lt

Register your product and get support at Indoor wireless headphones SHC8535 SHC8575 LT Vartotojo vadovas

Algoritmai ir duomenų struktūros (ADS) 7 paskaita Saulius Ragaišis, VU MIF

PATVIRTINTA

Prašymo taikyti galutinio vartojimo, laikinojo įvežimo, laikinojo įvežimo perdirbti ir laikinojo išvežimo perdirbti langeliuose įrašomi duomenys: 1. P

NACIONALINIS KIBERNETINIO SAUGUMO CENTRAS Tel El. p. NACIONALINIS KIBERNETINIO SAUGUMO CENTRAS PRIE KRA

GPAIS vartotojo vadovas savivaldybėms GPAIS VARTOTOJO VADOVAS SAVIVALDYBIŲ PILDOMAI INFORMACIJAI GPAIS TURINYS 1. BENDRI DARBO SU GPAIS PRINCIPAI... 2

PowerPoint Presentation

Prekių pirkimo pardavimo taisyklės

Lietuvos energetikos instituto

Polaroid ZIP Nuotraukų spaudiniai nenaudojant rašalo Savininko vadovas {General Product Image} Sveiki! Sveiki prisijungę prie Polaroid šeimos. Šis var

274 PRIEDAI K priedas. Elektroninio vartotojo gyvavimo ciklo tyrimo duomenų charakteristikos K.1 lentelė. Klausimyno dalies, skirtos elektroninio vart

200_TRA_LT.cdr

CL2013O0023LT _cp 1..1

RET2000 Elektronisis Skaitmeninis Termostatas su LCD

PowerPoint Presentation

Slide 1

skaitiniai metodai 1

C(2016)7159/F1 - LT (annex)

DUOMENŲ TEIKIMO SUTARČIŲ REGISTRUI ELEKTRONINIU BŪDU

HISREP sutartis notarams

Transkriptas:

IŠ PRAEITOS PASKAITOS JpaRepository API yra User[Entity] tik aplinkiniai sluoksniai, DB (tiksliau Entity Manager šiuo atveju) arba servisas, gali keistis duomenimis su šiuo API taigi čia galima būtų bendrauti su serviso DTO objektais, tačiau kadangi mes šio sluoksnio neprogramuojam, tai nebūtinai pvz. jis gali išsaugoti User su id, firstname, lastname, username 1

IŠ PRAEITOS PASKAITOS Service API yra User[Service] tik aplinkiniai sluoksniai, JpaRepository arba RestController, gali su juo keistis duomenimis skirtas duomenis transformuoti ir perduoti iš DB arba atgal į DB jis gali sukurti User su daliniais duomenimis, pvz. gaudamas tik firstname+lastname turi pasirūpinti ID generavimu (jei ne AUTO), ką rašyti į username laukelį, taip pat patikra ar User su tokiu firstname+lastname dar nėra, o jei yra ir firstname+lastname+username derinys unikalus, sugeneruoti kokį nors username 2

IŠ PRAEITOS PASKAITOS RestController API yra User[Rest] tik aplinkiniai sluoksniai, Rest naudotojas (React) arba Service, gali su juo keistis duomenimis skirtas surinkti duomenis iš Rest naudotojo įvairiais formatais ir perduoti į Service apdorojimui, o taip pat gautus duomenis iš Service paversti Rest naudotojui suprantamu formatu ir grąžinti jis gali turėti pvz /create-user ir leisti užklausą User kūrimui paduodant tik {firstname, lastname šiuo atveju User[Rest] bus tik su firstname ir lastname 3

IŠ PRAEITOS PASKAITOS Vėliau kai suprasite, kaip viskas veikia, galite sugalvoti, kaip sumažinti objektų skaičių, tačiau turite pasirūpinti, kad: User[Entity] tiesiogiai niekada nenueitų Rest klientui ir dėl saugumo, ir dėl to, kad klientas neturi prisirišti pvz. prie duomenų bazės vidinių savybių neprašyti kliento User[Entity] duomenų pvz. vienoj duomenų bazėj User[Entity] ID bus Long, kitoj String. Jei reikia unikaliai identifikuoti User, geriau tai daryti pvz. per username arba leisti UserService sugeneruoti ir išsaugoti nuo DB nepriklausantį unikalų ID 4

JPA SĄRYŠIAI TARP ESYBIŲ. KOLEKCIJŲ SAUGOJIMAS. PAVELDĖJIMAS. KASKADINĖS OPERACIJOS. Andrius Stašauskas andrius@stasauskas.lt http://stasauskas.lt/itpro2018/ 5

TURINYS Sąryšiai tarp esybių Kolekcijų saugojimas Kaskadinės operacijos Duomenų tikrinimas - validacija Entity paveldėjimas 6

SĄRYŠIAI TARP ESYBIŲ 7

SĄRYŠIŲ TARP ESYBIŲ VALDYMAS Saryšiai gali būti: One-to-one one-to-many many-to-many many-to-one Vienpusiai ir abipusiai Palaikantys Collection, Set, List ir Map tipus 8

SĄRYŠIAI: VIENAS-SU-VIENU @Entity public class Customer { @OneToOne private Credentials credentials; Turime nuorodą į vieną Credentials. 9

SĄRYŠIAI: VIENAS-SU-VIENU @Entity public class Customer { @Id public Long id; @OneToOne public Credentials credentials; @Entity public class Credentials { @Id public Long id; public String username; @OneToOne(mappedBy="credentials") public Customer customer; one-to-one sąryšis aprašomas @OneToOne anotacija Jei sąryšis dvipusis, ne savininko pusė turi naudoti mappedby žymėjimą. Šiuo atveju Customer yra savininkas ir turės išorinį raktą į Credentials. 10

SĄRYŠIAI: VIENAS-SU-VIENU @Entity public class Customer { @OneToOne @JoinColumn(name="credentials_id") private Credentials credentials; Lentelėje Customer yra nuoroda: stulpelis credentials_id su foreign key į Credentials 11

SĄRYŠIAI: VIENAS-SU-DAUG @Entity class Cart { @Id private Integer id; @OneToMany private List<Good> goods; @Entity class Good { @Id private Integer id; @ManyToOne private Cart cart; many-to-one ryšys pažymimas @ManyToOne anotacija ir naudojamas esybėje, kurių bus "daug" one-to-many žymimas @OneToMany anotacija ir naudojamas klasėje, kurių bus tik "viena" Lentelėje Good yra stulpelis cart_id su FK į Cart 12

SĄRYŠIAI: VIENAS-SU-DAUG @Entity class Cart { @Id private Long id; @OneToMany(mappedBy="cart") private Set<Good> goods = new HashSet() public void addgood(good good) { this.goods.add(good); good.setcart(this); @Entity class Good { @Id private Long id; @ManyToOne @JoinColumn(name = "cart_id") private Cart cart; public Cart getcart() { return cart; mappedby elementas parodo, kad išorinį raktą turi kita esybė. Good lentelėje bus "cart" stulpelis - išorinis raktas į Cart lentelę. Good yra "savininkas", todėl kiekvieną kartą pridedant naują prekę į krepšelį, turi būti susiejamas krepšelis, kviečiant savininko susiejimo metodą setcart(). 13

SĄRYŠIAI: DAUG-SU-DAUG @Entity class Cart { @Id private Integer id; @ManyToMany private List<Good> goods; @Entity class Good { @Id private Integer id; @ManyToMany private List<Cart> carts; Sąryšis žymimas @ManyToMany anotacija lentelės sujungtos trečia jungimo lentele Cart_Good 14

SĄRYŠIAI: DAUG-SU-DAUG @Entity class Cart { @Id private Integer id; @ManyToMany(mappedBy="carts private List<Good> goods; @Entity class Good { @Id private Integer id; @ManyToMany @JoinTable(table=@Table(name="G_C"), joincolumns=@joincolumn(name="g_id"), inversejoincolumns=@joincolumn(name="c_id")) private List<Cart> carts; sąryšis realizuojamas naudojant asociatyvines lenteles (join table). Šiuo atveju lentelė "G_C" joincolumns nurodo esamos lentelės (Good) id stulpelį, inversejoincolumns - susietos (Cart) jei sąryšis dvipusis, kita sąryšio pusė turi naudoti mappedby elementą 15

KOLEKCIJŲ SAUGOJIMAS 16

JPA PERSIST MAP savininko pusėje reikalinga nurodyti @MapKey @Entity public class Author { @ManyToMany @JoinTable( name="authorbookgroup", joincolumns={@joincolumn(name="fk_author", referencedcolumnname="id"), inversejoincolumns={@joincolumn(name="fk_group", referencedcolumnname="id")) @MapKey(name = "title") private Map<String, Book> books = new HashMap<String, Book>(); 17

JPA PERSIST MAP priklausomai nuo key tipo: @MapKey - unikalus atributas Map#value klasės lauke, jei raktas bazinio tipo @MapKeyEnumerated - jei raktas Enum tipo @MapKeyTemporal - jei raktas Date ar Calendar tipo @MapKeyJoinColumn(name="id_rakte") - jei raktas sudėtingesnio Class tipo (raktas - objektas) nesupainiokite: @MapKeyColumn - stulpelis su @ElementCollection raktai-laukai aišku turi būti pažymėti @Temporal, @Enumerated, raktai-klasės - @Entity 18

JPA PERSIST COLLECTION Map<Long, Long> ar List<Long> galima tiesiog susikurti savo klasę MyNumber1 ir/ar MyNumber2, viduje turėti private Long atributą tuomet tai pavirs į Map<Long, MyNumber1> ar Map<MyNumber1, MyNumber2> ar List<MyNumber1> galima bus naudoti įprastas anotacijas @OneToMany, @ManyToMany ir t.t. daugiau kontrolės, nes yra atskiros lentelės ar laukai 19

JPA PERSIST COLLECTION arba naudoti @ElementCollection paprastiems tipams @ElementCollection private Collection<String> l = new ArrayList<>(); @ElementCollection private Map<Long, Long> m = new HashMap<>(); bet norint dirbti su klasėmis, reiks žinoti @Embeded, @Embeddable, @MapKeyColumn, @CollectionTable ir kitas susijusias anotacijas mažiau kontrolės ir sunkiau keisti kodą (refactoring) ir migruoti duomenis 20

KASKADINĖS OPERACIJOS 21

KASKADINĖS OPERACIJOS jei nenurodyta kitaip, EntityManager operacijos taikomos tik tam entity objektui, kuris perduotas kaip parametras. Operacijos NEPERSIDUOS kitiems entity objektams, kurie pasiekiami per sąryšius. remove() operacijai tai dažnai ir yra norimas veikimas class Cart { @OneToMany private List<Good> goods; entitymanager.remove(cart); // iš DB ištrins tik Cart 22

KASKADINĖS OPERACIJOS Jeigu turime dvi susietas esybes, turime jas išsaugoti pradedant nuo savarankiškų ir baigiant savininkais Customer customer = new Customer(); Credentials cred = new Credentials(); customer.setcredentials(cred); em.persist(credentials); em.persist(customer); 23

KASKADINĖS OPERACIJOS Tačiau galima saugojimo operacijas kaskaduoti susijusiems entity objektams, pvz.: persist() gali būti įvykdyta visoms susijusioms esybėms, nors kaip parametras perduodamas tik vienas entity objektas Reikia įsitikinti, kad susijusi esybė susieta (merged) prieš kviečiant persist(), t.y. ji negali būti detached @Entity public class Customer { @Id public Long id; @OneToOne(cascade=CascadeType.Persist) public Credentials credentials; 24

OPERACIJŲ TIPAI Galimi cascade tipai: REMOVE - kaskadinis priklausančių objektų trynimas PERSIST - priklausančių objektų išsaugojimas kartu REFRESH - priklausančių objektų atnaujinimas MERGE - objektų būsenos saugojimas ir užkrovimas DETACH - objektų būsenos atsiejimas ALL - visų operacijų kaskadinis vykdymas priklausantiems objektams Dvipusiams ryšiams reikia nurodyti kaskadas iš abiejų pusių, jeigu norima, kad jos veiktų simetriškai. 25

OPERACIJŲ TIPAI Dažnai yra naudojami MERGE ir DETACH tipai kartu class User { @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.DETACH) private List<Role> roles; tai reiškia, kad jei bus atsiejama User esybė, tai automatiškai bus atsietos ir Role esybės ir atvirkšiai: saugant User pakeitimus (merge) išsisaugos ir Role pakeitimai 26

SĄRYŠIŲ ELEMENTŲ ĮTERPIMAS @Entity class Cart { @Id private Long id; @OneToMany(mappedBy="cart", cascade = CascadeType.ALL) private Set<Good> goods = new HashSet(); public void addgood(good good) { this.goods.add(good); good.setcart(this); @Entity class Good { @Id private Long id; @ManyToOne(cascade = {CascadeType.MERGE, CascadeType.DETACH) @JoinColumn(name = "cart_id") private Cart cart; public Cart getcart() { return cart; atkreipkite dėmesį dar kartą: addgood metodas yra ne savininko pusėje tam, kad nustatytų ant norimo pridėti savininko.. save ManyToMany atveju galioja ta pati taisyklė Cascade PERSIST netiks, nes atbulai kaskadinimas dažniausiai nevyksta jei egzistuoja savininkas-owner (bent jau su Hibernate) 27

SĄRYŠIŲ PAŠALINIMAS ManyToMany ar kitais atvejais, kai sąryšiams naudojama papildoma lentelė, ką reiškia REMOVE? ar tai sąryšio pašalinimas? ar tai sąryšio ir susietos klasės objekto (lentelės įrašo) pašalinimas? @OneToOne ir @OneToMany turi orphanremoval Whether to apply the remove operation to entities that have been removed from the relationship and to cascade the remove operation to those entities. 28

@OneToOne(orphanRemoval=true) @OneToMany(orphanRemoval=true) SĄRYŠIŲ PAŠALINIMAS kuris reiškia, kad bus trinami ne tik sąryšiai, bet ir surištas objektas, jei jis yra "našlaitis" (angl. orphan), t.y. prie nieko neprikabintas ir jei jis nėra detached, nėra new, ir nėra removed 29

UŽDUOTIS #1 - ONETOONE sukurti prekei klasę ProductDetails papildomai informacijai saugoti ProductDetails turi turėti image ir description prie produkto šių laukų turi nebelikti įgyvendinti OneToOne ryšį tarp Product ir ProductDetails t.y. jei anksčiau turėjome product.getdescription() tai dabar bus product.getproductdetails().getdescription() turi pilnai veikti CRUD operacijos tiek produktui, tiek produkto papildomos informacijos esybei neturi kristi išimčių (exception) 30

UŽDUOTIS #1 - MANYTOMANY įgyvendinti ManyToMany ryšį tarp krepšelio ir prekių turi pilnai veikti CRUD operacijos tiek krepšeliui, tiek prekėms neturi kristi išimčių (exception) 31

ATIDĖTAS UŽKROVIMAS 32

ATIDĖTAS UŽKROVIMAS (LAZY LOADING) retai kada prireikia visų objekto sąryšių vienu metu dažnai užtenka vieno ar poros sąryšių programos greitaveika gali būti optimizuojama nurodant, kad sąryšių užkrovimas yra atidėtas iki to momento, kol bus paprašyta iškviestas getxxx() metodas Tai vadinama lazy loading prisiminkime lazy loading beans 33

ATIDĖTAS UŽKROVIMAS (LAZY LOADING) Jeigu sąryšio fetch mode nėra nurodyta: Vienos reikšmės sąryšiuose susijęs objektas užkraunamas iš karto, neatidedant. Kolekcijos tipo sąryšiai pagal nutylėjimą atidedami. Dvipusiuose sąryšiuose iš vienos pusės gali būti nustatytas atidėtas, iš kitos - momentinis užkrovimas Normalu, kad poreikis gali skirtis, priklausomai iš krypties iš kurios daroma užklausa 34

ATIDĖTAS UŽKROVIMAS (LAZY LOADING) Atidėto užkrovimo direktyva lazy gali būti ignoruojama JPA implementacijos, nes iš principo paankstinus nebus pažeistas korektiškumas. Priešingai išankstinio užkrovimo direktyva negali būti ignoruojama, nes sugriautų objekto korektiškumą, jeigu po užkrovimo entity pereitų į detached būseną sąryšis taptų nebepasiekiamas. 35

ATIDĖTAS - LAZY class Cart { @OneToMany(fetch=FetchType.LAZY) private List<Good> goods; public List<Good> getgoods() { return goods; Goods iš DB bus atsiųstas tik iškvietus getgoods(...) metodą Jei metodas niekada nebus iškviestas - duomenys niekada nebus užkrauti iš DB 36

IŠ KARTO - EAGER class Cart { @OneToMany(fetch=FetchType.EAGER) private List<Good> goods; public List<Good> getgoods() { return goods; Duomenys užkraunami iš kart 37

ENTITY PAVELDĖJIMAS, VALIDAVIMAS, INDEKSAI IR KITA 38

DUOMENŲ TIKRINIMAS - VALIDACIJA Bean Validation taip pat kaip ir RestController validavimo atveju: @NotNull @DecimalMin ar @Digits @Min ir @Max @Size(min,max) @Future ir @Past Kitas anotacijas galima rasti JSR 380 standarte Įjungtas ne anotacija, o application.properties faile nustatyti none norint išjungti ( dokumentacija) 39

INDEKSŲ GENERAVIMAS indeksus dažniausiai naudojame: jei nenorime tikrinti, ar jau egzistuoja kokių nors duomenų, kurie turi būti unikalūs (pvz. email) jei norime, kad paieška ar rūšiavimas vyktų greičiau @Index anotacija leidžia apsirašyti ne-automatinius (PK/FK/Unique) indeksus @Index naudojama tik kaip kitų anotacijų sudedamoji dalis: Table, SecondaryTable, CollectionTable, JoinTable, TableGenerator 40

INDEKSŲ GENERAVIMAS @Entity @Table(name = "region", indexes = { @Index(name = "idx_code", columnlist="code", unique = true), @Index(name = "idx_name", columnlist="name ASC", unique = false), @Index(name = "idx_name_code", columnlist="name,code DESC") ) public class Region{ @Column(name = "code", nullable = false) private String code; @Column(name = "name", nullable = false) private String name; 41

DUOMENŲ PATIKRINIMAS AR INDEKSAI? Jeigu naudojate pvz. existsby duomenų patikrai prieš kuriant įrašą, pirma jūs galite patikrinti, o tuo metu kas nors gali įdėti toki patį įrašą dar prieš jums spėjant įvykdyti transakciją Todėl norint užtikrinti, kad laukas bus unikalus, vis tiek reikia prie lentelės sukurti @Index unikalų indeksą @Table(name = "user", indexes = { @Index(name = "idx_nickname", columnlist = "nickname", unique = true) ) 42

JPA LIFECYCLE METODAI Specialios anotacijos entity metodams pažymėti, jeigu jie turi būti iškviečiami tam tikru momentu gyvavimo cikle @PrePersist @PreRemove @PostPersist @PostRemove @PreUpdate @PostUpdate @PostLoad daugiau informacijos specifikacijoje ir čia 43

JPA LIFECYCLE METODAI turėdami faktūrą ir kliento duomenis joje, galime automatiškai sukurti klientą, tiesiog saugodami faktūrą @Entity class Invoice { private Customer cust; private String name; private Address address; @PreCreate public void onprecreate() { // Automatically create a new customer if (getcustomer() == null) { Customer cust = new Customer(); cust.setname(getname()); cust.setaddress(getaddress()); cust = em.merge(cust); // attach this new entity setcustomer(cust); // and here we change a relationship 44

ENTITY PAVELDĖJIMAS - TĖVAS kai norime aprašyti bendras savybes grupei Entity klasių, tačiau bazinės klasės nenorime turėti kaip atskiros entity: @MappedSuperclass public class Person { @Id protected Long id; protected String name; @Embedded protected Address address; @Entity public class Customer extends Person { @Transient protected int ordercount; @OneToMany protected Set<Order> orders = new HashSet(); 45

ENTITY PAVELDĖJIMAS - VIENOJE LENTELĖJE kai norime aprašyti bendras savybes grupei Entity klasių, tačiau bazinės klasės nenorime turėti kaip atskiros entity: @Entity @Table(name = "VEHICLE") @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "VEHICLE_TYPE") public abstract class Vehicle { /* Vehicle class code */ @MappedSuperclass public abstract class PassengerV extends Vehicle { @Entity @DiscriminatorValue(value = "Bike") public class Bike extends PassengerV { @Entity @DiscriminatorValue(value = "Car") public class Car extends PassengerV { daugiau informacijos čia ir čia 46

PAPILDOMOS GALIMYBĖS Rakinimas (Locking) yra techika norint suvaldyti situacijas, kai tuos pačius duomenis vienu metu keičia keli naudotojai. Užrakinant duomenis užtikriname, kad tik vienas iš naudotojų vienu metu galės keisti duomenis. JPA palaiko pesimistinį ir optimistinį režimus kontroliuojama su anotacijomis @Version ir @LockModeType Optimistinis: visiem leidžiama skaityti ir keisti, prieš commit įvyksta patikrinimas, ar įrašo versija nepasikeitė. Jei pasikeitė metamas exception. Geresnė greitaveika. Pesimistinis: užrakinama DB įrašo lygyje ir neleidžiama rašyti ir/arba skaityti. Trys būdai, kaip atlikti rakinimą: EntityManager methodai: lock, find, refresh Query methodas: setlockmode NamedQuery anotacija: lockmode elementas 47

KITA, KAS SVARBU kaip spręsti problemas pesimistic/optimistic lock Criteria API JPQL JOIN TREAT reikšmių konvertavimas su @Convert @NamedEntityGraph @ConstructorResult Java klasių generavimas iš SQL ir DB lentelių 48

NUORODOS JPA 2.1 Specification PDF EE7/Persistence Tutorial JPQL pavyzdžiai čia ir čia JPQL sintaksė Vidinės užklausos ir Criteria NamedEntityGraph čia ir čia Dinamiškai formuojamos vardinės užklausos JSR-338 Java Persistence 2.1 Oficiali dokumentacija JPA 2.x specification Hibernate Community Documentation, EntityManager 49

UŽDUOTIS #2 - PAVELDĖJIMAS prekę pakeisti į vienos lentelės paveldimumo tipo esybę su diskriminatoriumi praplėsti prekę keliomis prekių grupėmis, pvz. Clothes ir Toys įsitikinti, kad tokias prekes iš lentelės įmanoma nuskaityti kad jas įmanoma išsaugoti kad jas galima pridėti ir išimti iš krepšelio 50

KITOJE PASKAITOJE Spring Security. Live coding 51