Programiranje

Vztrajnost Java z JPA in Hibernate, 1. del: Entitete in odnosi

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 BigIntegerali 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 profilje 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č Avtors:

 @ 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 a Poizvedba primerek, ki se lahko uporablja za pridobivanje entitet iz baze podatkov.
  • createNamedQuery obremenitve a Poizvedba 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ča EntityTransaction 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. The getTransaction () metoda vam omogoča dostop do tega vedenja na ravni EntityManager, namesto baze podatkov.
  • spajanje () doda entiteto v kontekst trajnosti, tako da se bo ob prevzemu transakcije entiteta ohranila v zbirki podatkov. Pri uporabi spajanje (), predmeti se ne upravljajo.
  • vztrajajo doda entiteto v kontekst obstojnosti, tako da se bo ob prevzemu transakcije entiteta ohranila v zbirki podatkov. Pri uporabi vztrajati (), 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.

$config[zx-auto] not found$config[zx-overlay] not found