API za obstojnost Java (JPA) je specifikacija Java, ki zapolnjuje vrzel med relacijskimi bazami podatkov in objektno usmerjenim programiranjem. Ta dvodelna vadnica predstavlja JPA in pojasnjuje, kako so predmeti Java modelirani kot entitete JPA, kako so definirani odnosi entitet in kako uporabljati JPA EntityManager
z vzorcem Repozitorija v aplikacijah Java.
Upoštevajte, da ta vadnica uporablja Hibernate kot ponudnika JPA. Večino konceptov je mogoče razširiti na druge okvire obstojnosti Java.
Kaj je JPA?
Glejte "Kaj je JPA? Uvod v API za obstojnost Java", če želite izvedeti več o razvoju JPA in s tem povezanih okvirih, vključno z EJB 3.0. in JDBC.
Predmetni odnosi v JPA
Relacijske zbirke podatkov obstajajo kot sredstvo za shranjevanje programskih podatkov že od sedemdesetih let prejšnjega stoletja. Čeprav imajo razvijalci danes veliko možnosti za relacijsko bazo podatkov, je ta vrsta zbirke podatkov prilagodljiva in dobro razumljena ter se še vedno pogosto uporablja pri majhnem in velikem razvoju programske opreme.
Objekti Java v kontekstu relacijske baze podatkov so definirani kot subjekti. Entitete so postavljene v tabele, kjer zasedajo stolpce in vrstice. Programerji uporabljajo tuji ključi in združi tabele opredeliti razmerja med entitetami - in sicer razmerja ena na ena, ena na več in veliko na veliko. Uporabljamo lahko tudi SQL (jezik strukturiranih poizvedb) za pridobivanje in interakcijo s podatki v posameznih tabelah in v več tabelah z uporabo omejitev tujih ključev. Relacijski model je raven, vendar lahko razvijalci pišejo poizvedbe za pridobivanje podatkov in konstruiranje predmetov iz teh podatkov.
Neujemanje impedance razmerja med objekti in razmerji
Izraz vam je morda znan neusklajenost impedance med objektnimi razmerji, ki se nanaša na izziv preslikave podatkovnih objektov v relacijsko bazo podatkov. Do te neusklajenosti pride, ker objektno usmerjeno načrtovanje ni omejeno na razmerja ena na ena, ena na več in veliko na veliko. Namesto tega pri objektno usmerjenem oblikovanju razmišljamo o predmetih, njihovih lastnostih in vedenju ter o tem, kako se predmeti povezujejo. Dva primera sta enkapsulacija in dedovanje:
- Če objekt vsebuje drug predmet, to definiramo skozi inkapsulacija- a ima razmerje.
- Če je predmet specializacija drugega predmeta, to določimo skozi dedovanje--an je razmerje.
Združevanje, združevanje, sestava, abstrakcija, posploševanje, uresničevanje in odvisnosti so vsi objektno usmerjeni koncepti programiranja, ki jih je težko izvesti za preslikavo v relacijski model.
ORM: Predmetno-relacijsko preslikavanje
Neusklajenost med objektno usmerjenim načrtovanjem in modeliranjem relacijskih baz podatkov je privedla do vrste orodij, razvitih posebej za objektno-relacijsko preslikavo (ORM). Orodja ORM, kot so Hibernate, EclipseLink in iBatis, prevajajo modele relacijskih baz podatkov, vključno z entitetami in njihovimi odnosi, v objektno usmerjene modele. Številna od teh orodij so obstajala že pred specifikacijo JPA, vendar so bile njihove funkcije brez standarda odvisne od prodajalca.
Java Persistence API (JPA), ki je bil prvič izdan leta 2006 kot del EJB 3.0, ponuja standardni način označevanja objektov, tako da jih je mogoče preslikati in shraniti v relacijsko bazo podatkov. Specifikacija določa tudi skupni konstrukt za interakcijo z bazami podatkov. Standard ORM za Javo prinaša doslednost pri izvedbah ponudnikov, hkrati pa omogoča prilagodljivost in dodatke. Kot primer, čeprav je prvotna specifikacija JPA uporabljena za relacijske baze podatkov, so nekatere izvedbe ponudnikov razširile JPA za uporabo z bazami podatkov NoSQL.
Razvoj JPA
Prva izdaja JPA, različica 1.0, je bila objavljena leta 2006 prek Java Community Process (JCP) kot Zahteva za specifikacijo Java (JSR) 220. Različica 2.0 (JSR 317) je bila objavljena leta 2009, različica 2.1 (JSR 338) leta 2013, in različica 2.2 (izdaja JSR 338 za vzdrževanje) je bila objavljena leta 2017. JPA 2.2 je bila izbrana za vključitev in nadaljnji razvoj v Džakarti EE.
Uvod v JPA
API za obstojnost Java je specifikacija in ne izvedba: definira običajno abstrakcijo, ki jo lahko uporabite v kodi za interakcijo z izdelki ORM. V tem poglavju so opisani nekateri pomembni deli specifikacije JPA.
Naučili se boste, kako:
- V bazi podatkov določite entitete, polja in primarne ključe.
- Ustvarite razmerja med entitetami v bazi podatkov.
- Sodelujte z
EntityManager
in njegove metode.
Opredelitev entitet
Če želite definirati entiteto, morate ustvariti razred, ki je označen z @Entiteta
pripis. The @Entiteta
pripis je oznaka označevalnika, ki se uporablja za odkrivanje trajnih entitet. Če bi na primer želeli ustvariti knjižno entiteto, bi jo označili na naslednji način:
Knjiga javnega razreda @Entity {...}
Ta entiteta bo privzeto preslikana v Knjiga
tabelo, kot je določeno z navedenim imenom razreda. Če želite to entiteto preslikati v drugo tabelo (in po želji v določeno shemo), lahko uporabite @Table
pripomba za to. Evo, kako bi preslikali Knjiga
razreda do tabele BOOKS:
@Entity @Table (name = "BOOKS") knjiga javnega razreda {...}
Če je bila tabela BOOKS v shemi PUBLISHING, lahko shemo dodate v @Table
opomba:
@Tabela (name = "KNJIGE", shema = "OBJAVA")
Preslikava polj v stolpce
Ko je entiteta preslikana v tabelo, je naslednja naloga določiti njena polja. Polja so definirane kot spremenljivke članov v razredu, pri čemer se ime vsakega polja preslika v ime stolpca v tabeli. To privzeto preslikavo lahko preglasite z uporabo @ Stolpec
opomba, kot je prikazano tukaj:
@Entity @Table (name = "BOOKS") knjiga javnega razreda {private String name; @Column (name = "ISBN_NUMBER") zasebni niz isbn; ...}
V tem primeru smo sprejeli privzeto preslikavo za ime
atribut, vendar je določil preslikavo po meri za isbn
atribut. The ime
atribut bo preslikan v ime stolpec, vendar isbn
atribut bo preslikan v stolpec ISBN_NUMBER.
The @ Stolpec
anotacija nam omogoča, da določimo dodatne lastnosti polja / stolpca, vključno z dolžino, ali je ničelna, ali mora biti unikatna, natančnost in lestvica (če gre za decimalno vrednost), ali jo je mogoče vstaviti in posodobiti itd.
Določanje primarnega ključa
Ena od zahtev za tabelo relacijske baze podatkov je, da mora vsebovati a primarni ključali ključ, ki enolično identificira določeno vrstico v zbirki podatkov. V JPA uporabljamo @Id
pripis za določitev polja kot primarnega ključa tabele. Primarni ključ mora biti primitivni tip Java, primitivni ovoj, na primer Celo število
ali dolga
, a Vrvica
, a Datum
, a BigInteger
ali a BigDecimal
.
V tem primeru preslikamo id
atribut, ki je Celo število
, v stolpec ID v tabeli BOOKS:
@Entity @Table (name = "BOOKS") knjiga javnega razreda {@Id private Integer id; ime zasebnega niza; @Column (name = "ISBN_NUMBER") zasebni niz isbn; ...}
Možno je tudi kombiniranje @Id
pripis z @ Stolpec
pripis za prepisovanje preslikave imena stolpca primarnega ključa.
Razmerja med entitetami
Zdaj, ko veste, kako definirati entiteto, poglejmo, kako ustvariti razmerja med entitetami. JPA opredeljuje štiri pripise za definiranje entitet:
@OneToOne
@OneToMany
@ManyToOne
@ManyToMany
Odnosi ena na ena
The @OneToOne
pripis se uporablja za definiranje razmerja ena na ena med dvema entitetama. Na primer, lahko imate Uporabnik
entiteta, ki vsebuje uporabniško ime, e-poštni naslov in geslo, vendar boste morda želeli ohraniti dodatne informacije o uporabniku (kot so starost, spol in najljubša barva) v ločenem Uporabniški profil
entiteta. The @OneToOne
Pripis omogoča razčlenitev vaših podatkov in entitet na ta način.
The Uporabnik
razred spodaj ima en sam Uporabniški profil
primer. The Uporabniški profil
zemljevidi v en sam Uporabnik
primer.
@Entity javni razred Uporabnik {@Id private Integer id; zasebni niz e-pošte; ime zasebnega niza; geslo zasebnega niza; @OneToOne (mappedBy = "user") zasebni profil UserProfile; ...}
@Entity javni razred UserProfile {@Id private Integer id; zasebna int starost; zasebni niz spola; private String favoriteColor; @OneToOne zasebni uporabnik; ...}
Ponudnik JPA uporablja Uporabniški profil
je uporabnik
polje za preslikavo Uporabniški profil
do Uporabnik
. Preslikava je določena v mappedBy
atribut v @OneToOne
pripis.
Odnosi ena-do-mnogih in mnogi-do-enega
The @OneToMany
in @ManyToOne
pripisi olajšajo obe strani istega odnosa. Poglejmo primer, kjer a Knjiga
lahko ima samo enega Avtor
, ampak an Avtor
ima lahko veliko knjig. The Knjiga
entiteta bi opredelila a @ManyToOne
odnos z Avtor
in Avtor
entiteta bi opredelila a @OneToMany
odnos z Knjiga
.
@ Entity public class Book {@Id private Integer id; ime zasebnega niza; @ManyToOne @JoinColumn (name = "AUTHOR_ID") zasebni avtor avtor; ...}
@Entity javni razred Avtor {@Id @GeneratedValue private Integer id; ime zasebnega niza; @OneToMany (mappedBy = "author") zasebni seznam books = new ArrayList (); ...}
V tem primeru je Avtor
razred vzdržuje seznam vseh knjig, ki jih je napisal ta avtor in Knjiga
razred ohranja sklicevanje na enega samega avtorja. Poleg tega @JoinColumn
določa ime stolpca v Knjiga
tabela za shranjevanje ID Avtor
.
Odnosi veliko do veliko
Končno, @ManyToMany
anotacija olajša razmerje med številkami in entitetami. Tu je primer, ko a Knjiga
entiteta ima več Avtor
s:
@ Entity public class Book {@Id private Integer id; ime zasebnega niza; @ManyToMany @JoinTable (name = "BOOK_AUTHORS", joinColumns = @ JoinColumn (name = "BOOK_ID"), inverseJoinColumns = @ JoinColumn (name = "AUTHOR_ID")) zasebno Nastavi avtorje = nov HashSet (); ...}
@Entity javni razred Avtor {@Id @GeneratedValue private Integer id; ime zasebnega niza; @ManyToMany (mappedBy = "author") zasebni Set books = new HashSet (); ...}
V tem primeru ustvarimo novo tabelo, BOOK_AUTHORS
, z dvema stolpcema: BOOK_ID
in AUTHOR_ID
. Uporabljati joinColumns
in inverseJoinColumns
atributi vašemu okviru JPA povejo, kako te razrede preslikati v razmerje med mnogimi in mnogimi. The @ManyToMany
pripis v Avtor
razred se sklicuje na polje v Knjiga
razred, ki upravlja odnos; in sicer avtorji
lastnine.
To je hitra predstavitev za dokaj zapleteno temo. Potopimo se še naprej v @JoinTable
in @JoinColumn
v naslednjem članku.
Delo s programom EntityManager
EntityManager
je razred, ki izvaja interakcije z bazo podatkov v JPA. Inicializira se z imenovano konfiguracijsko datoteko persistence.xml
. Ta datoteka je v META-INF
mapo v vašem ZAPRTI
, ki je običajno zapakiran v datoteko JAR ali WAR. The persistence.xml
datoteka vsebuje:
- Imenovana "enota obstojnosti", ki določa okvir obstojnosti, ki ga uporabljate, na primer Hibernate ali EclipseLink.
- Zbirka lastnosti, ki določajo, kako vzpostaviti povezavo z bazo podatkov, in morebitne prilagoditve v okviru trajnosti.
- Seznam razredov entitet v vašem projektu.
Oglejmo si primer.
Konfiguriranje EntityManager
Najprej ustvarimo EntityManager
uporabljati EntityManagerFactory
pridobljeno iz Vztrajnost
razred:
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory ("Knjige"); EntityManager entityManager = entityManagerFactory.createEntityManager ();
V tem primeru smo ustvarili EntityManager
ki je povezan z enoto vztrajnosti "Knjige", ki smo jo konfigurirali v persistence.xml
mapa.
The EntityManager
razred definira, kako bo naša programska oprema sodelovala z bazo podatkov prek entitet JPA. Tu je nekaj metod, ki jih uporablja EntityManager
:
najti
pridobi entiteto po primarnem ključu.createQuery
ustvari aPoizvedba
primerek, ki se lahko uporablja za pridobivanje entitet iz baze podatkov.createNamedQuery
obremenitve aPoizvedba
ki je opredeljeno v a@NamedQuery
v eni od entitet obstojnosti. Poimenovane poizvedbe zagotoviti jasen mehanizem za centraliziranje poizvedb JPA v definiciji razreda trajnosti, v katerem se bo poizvedba izvedla.getTransaction
določaEntityTransaction
za uporabo v interakcijah z bazo podatkov. Tako kot transakcije z bazami podatkov boste običajno začeli transakcijo, izvedli svoje operacije in nato transakcijo prevzeli ali vrnili nazaj. ThegetTransaction ()
metoda vam omogoča dostop do tega vedenja na ravniEntityManager
, namesto baze podatkov.spajanje ()
doda entiteto v kontekst trajnosti, tako da se bo ob prevzemu transakcije entiteta ohranila v zbirki podatkov. Pri uporabispajanje ()
, predmeti se ne upravljajo.vztrajajo
doda entiteto v kontekst obstojnosti, tako da se bo ob prevzemu transakcije entiteta ohranila v zbirki podatkov. Pri uporabivztrajati ()
, predmeti se upravljajo.osvežite
osveži stanje trenutne entitete iz baze podatkov.splakovanje
sinhronizira stanje konteksta obstojnosti z bazo podatkov.
Ne skrbite za integracijo vseh teh metod hkrati. Spoznali jih boste z neposrednim sodelovanjem z EntityManager
, o čemer bomo več govorili v naslednjem poglavju.