Häzirki zaman ösüş dünýäsi durmuşy aňsatlaşdyrmak üçin döredilen dürli aýratynlyklardan doly. Gurallary bilip, dogry birini saýlap bilersiňiz. Bilmän durmuşyňyzy kynlaşdyryp bilersiňiz. Bu syn, JPA - Java Persistence API düşünjesiniň üstündäki gizlinlik perdesini aýyrar. Okanyňyzdan soň bu syrly dünýä has çuňňur çümmek islärsiňiz diýip umyt edýärin.
Giriş
Bilşimiz ýaly, programmalaryň esasy meselelerinden biri maglumatlary saklamak we gaýtadan işlemekdir. Öňki gowy günlerde adamlar maglumatlary diňe faýllarda saklaýardylar. Aöne bir wagtyň özünde okamak we redaktirlemek zerurlygy ýüze çykan badyna, bir ýük bar bolsa (ýagny bir wagtyň özünde birnäçe haýyş gelýär), maglumatlary diňe faýllarda saklamak meselä öwrülýär.
Maglumatlar bazalarynyň haýsy meseleleri çözýändigi we nädip çözülýändigi barada has giňişleýin maglumat üçin " Maglumatlar bazalarynyň gurluşy " atly makalany okamagyňyzy maslahat berýärin . Bu, maglumatlarymyzy maglumatlar bazasynda saklamagy karar edýändigimizi aňladýar. Java uzak wagtlap JDBC API (Java Maglumat bazasynyň birikmesi) ulanyp, maglumat bazalary bilen işlemegi başardy. JDBC hakda has giňişleýin maglumaty şu ýerden okap bilersiňiz: "
JDBC ýa-da nireden başlanýar ." Timeöne wagt geçdi we döredijiler her gezek maglumatlar bazasynda Java obýektlerini tygşytlamak we tersine, Java obýektlerini döretmek üçin ownuk amallar üçin birmeňzeş we gereksiz “tehniki hyzmat” koduny (Boilerplate kody diýilýär) ýazmak zerurlygy bilen ýüzbe-ýüz boldular. maglumat bazasy. Soň bolsa, bu meseleleri çözmek üçin ORM ýaly düşünje dünýä indi.
ORM - Obýekt-baglanyşyk kartasy ýa-da rus obýekt-baglanyşyk kartasyna terjime edildi. Maglumatlar bazalaryny obýekte gönükdirilen programmirleme dilleriniň düşünjeleri bilen baglanyşdyrýan programmirleme tehnologiýasy. Simplönekeýleşdirmek üçin, ORM Java obýektleri bilen maglumatlar bazasyndaky ýazgylaryň arasyndaky baglanyşykdyr:
ORM esasan Java obýektiniň maglumatlar bazasynda maglumat hökmünde görkezilip bilinjekdigi (we tersine). JPA spesifikasiýasy - Java Persistence API görnüşinde öz beýanyny tapdy. Spesifikasiýa eýýäm bu düşünjäni beýan edýän Java API-iň beýanydyr. Spesifikasiýa, ORM düşünjesine laýyklykda işlemek üçin haýsy gurallar bilen üpjün edilmelidigimizi (ýagny, haýsy interfeýsleriň üstünde işläp biljekdigimizi) aýdýar. Bu serişdeleri nädip ulanmaly. Spesifikasiýa gurallaryň ýerine ýetirilişini suratlandyrmaýar. Bu, bir spesifikasiýa üçin dürli amallary ulanmaga mümkinçilik berýär. Ony ýönekeýleşdirip, spesifikasiýa API-iň beýanydygyny aýdyp bilersiňiz. JPA spesifikasiýasynyň tekstini Oracle web sahypasynda tapyp bilersiňiz: "
JSR 338: JavaTM Persistence API ". Şonuň üçin JPA-ny ulanmak üçin tehnologiýany ulanjak käbir durmuşa geçirmelerimiz gerek. JPA ýerine ýetirişlerine JPA üpjün edijileri hem diýilýär. Iň görnükli JPA durmuşa geçirişlerinden biri
Gibernate . Şonuň üçin muny göz öňünde tutmagy teklip edýärin.
Taslama döretmek
JPA Java hakda bolansoň, bize Java taslamasy gerek bolar. Katalog gurluşyny el bilen döredip, zerur kitaphanalary özümiz goşup bilerdik. Projectsöne taslamalary ýygnamagy awtomatlaşdyrmak üçin ulgamlary ulanmak has amatly we dogry (meselem, bu diňe biziň üçin taslamalary ýygnamagy dolandyrjak programma. Kataloglary dörediň, synp ýoluna zerur kitaphanalary goşuň we ş.m. .). Şeýle ulgamlaryň biri Gradle. Gradle hakda has giňişleýin maglumaty şu ýerden okap bilersiňiz: "
Gradle barada gysgaça giriş ". Bilşimiz ýaly, Gradle funksiýasy (ýagny edip biljek zatlary) dürli Gradle Pluginleri ulanyp amala aşyrylýar.
Gradle we " Gradle Build Init Plugin " pluginini ulanalyň . Geliň buýrugy işledeliň:
gradle init --type java-application
Gradle biziň üçin zerur katalog gurluşyny eder we gurluşyk skriptinde taslamanyň esasy deklaratiw beýanyny döreder
build.gradle
. Şeýlelikde, bizde bir programma bar. Programma bilen suratlandyrmak ýa-da modellemek isleýän zatlarymyz hakda pikirlenmeli. Mysal üçin, käbir modelleme guralyny ulanalyň:
app.quickdatabasediagrams.com Bu ýerde beýan eden zadymyzyň “domen modelimiz” bolandygyny bellemelidiris. Domen “mowzuk meýdany”. Umuman alanyňda, domen latyn dilinde “eýeçilik”. Orta asyrlarda bu şalaryň ýa-da feodallaryň eýeçiligindäki ýerlere berlen atdy. Fransuz dilinde bolsa "sebit" diýip terjime edilýän "domen" sözüne öwrüldi. Şeýlelik bilen, “domen modelimiz” = “mowzuk modeli” beýan etdik. Bu modeliň her elementi haýsydyr bir “düýp many”, hakyky durmuşdan bir zat. Biziň ýagdaýymyzda bular subýektler: Kategoriýa (
Category
), Subýekt (
Topic
). Guramalar üçin aýratyn paket döredeliň, mysal üçin at modeli bilen. Geliň, şol ýerde subýektleri suratlandyrýan Java sapaklaryny goşalyň. Java kodunda şular ýaly guramalar adaty
POJO bolup , olar şeýle bolup biler:
public class Category {
private Long id;
private String title;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
Geliň, synpyň mazmunyny göçüreliň we meňzeşlik boýunça synp döredeliň
Topic
. Diňe özüne degişli kategoriýa barada bilýänleri bilen tapawutlanar. Şonuň üçin geliň,
Topic
bir kategoriýa meýdançasyny we onuň bilen işlemegiň usullaryny goşalyň:
private Category category;
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
Indi öz domen modeli bolan Java programmasy bar. Indi JPA taslamasyna birigip başlamagyň wagty geldi.
JPA goşmak
Şeýlelik bilen, JPA maglumatlar bazasynda bir zady ýatda saklarys diýmekdir. Şonuň üçin bize maglumat bazasy gerek. Taslamamyzda maglumat bazasy baglanyşygyny ulanmak üçin maglumatlar bazasyna birikmek üçin garaşlylyk kitaphanasyny goşmalydyrys. .Adymyzda bolsa, biziň üçin gurluşyk skriptini döreden Gradle ulandyk
build.gradle
. Onda taslamamyzyň zerur bolan baglylyklaryny suratlandyrarys. Baglylyk, kodumyzyň işlemeýän kitaphanalarydyr. Maglumatlar bazasyna birikmegiň garaşlylygynyň beýanyndan başlalyň. Muny diňe JDBC bilen işleýän bolsak, edil şonuň ýaly ederis:
dependencies {
implementation 'com.h2database:h2:1.4.199'
Indi maglumatlar bazamyz bar. Indi Java obýektlerimizi maglumat bazasynyň düşünjelerine (Java-dan SQL-a çenli) düzmek üçin jogapkär bir programma goşup bileris. .Adymyzda bolsa, munuň üçin Gibernate atly JPA spesifikasiýasynyň ýerine ýetirilişini ulanarys:
dependencies {
implementation 'com.h2database:h2:1.4.199'
implementation 'org.hibernate:hibernate-core:5.4.2.Final'
Indi JPA sazlamaly. Spesifikasiýa we "8.1 erjellik bölümi" bölümini okasak, tutanýerlilik bölüminiň konfigurasiýalaryň, metadatalaryň we subýektleriň haýsydyr bir utgaşmasydygyny bileris. JPA-nyň işlemegi üçin konfigurasiýa faýlynda iň bolmanda bir tutanýerlilik bölümini suratlandyrmaly
persistence.xml
. Locationerleşýän ýeri, "8.2 tutanýerlilik gaplamasy" spesifikasiýa bölüminde düşündirilýär. Bu bölüme görä, Java SE gurşawymyz bar bolsa, ony META-INF katalogynyň köküne goýmalydyrys.
Mazmuny "" "bölüminde JPA spesifikasiýasynda berlen mysaldan göçüreliň
8.2.1 persistence.xml file
:
<persistence>
<persistence-unit name="JavaRush">
<description>Persistence Unit For test</description>
<class>hibernate.model.Category</class>
<class>hibernate.model.Topic</class>
</persistence-unit>
</persistence>
Emma bu ýeterlik däl. JPA üpjün edijimiziň kimdigini aýtmalydyrys, ýagny JPA spesifikasiýasyny ýerine ýetirýän biri:
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
Indi sazlamalary goşalyň (
properties
). Olaryň käbiri (başlap
javax.persistence
) adaty JPA konfigurasiýalary bolup, JPA spesifikasiýasynda "8.2.1.9 häsiýetleri" bölüminde beýan edilýär. Käbir konfigurasiýalar üpjün edijä mahsusdyr (biziň ýagdaýymyzda, Jpa üpjün ediji hökmünde Gibernate täsir edýär. Sazlamalarymyz bloky şeýle bolar:
<properties>
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1;MVCC=TRUE" />
<property name="javax.persistence.jdbc.user" value="sa" />
<property name="javax.persistence.jdbc.password" value="" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.hbm2ddl.auto" value="create" />
</properties>
Indi JPA bilen utgaşdyrylan konfigurasiýamyz bar
persistence.xml
, JPA üpjün edijisi Hibernate bar we H2 maglumat bazasy bar, şeýle hem domen modelimiz bolan 2 synp bar. Ahyry bularyň hemmesini işledeliň. Katalogda
/test/java
, Gradle mylaýymlyk bilen birlik synaglary üçin bir şablon döretdi we oňa AppTest diýip at berdi. Geliň, ulanalyň. JPA spesifikasiýasynyň "7.1 tutanýerlilik kontekstleri" bölüminde aýdylyşy ýaly, JPA dünýäsindäki guramalar erjellik konteksti diýilýän giňişlikde ýaşaýarlar. Persöne tutanýerlilik konteksti bilen gönüden-göni işlemeýäris. Munuň üçin ulanýarys
Entity Manager
ýa-da "edara dolandyryjysy". Konteksti we ol ýerde haýsy guramalaryň ýaşaýandygyny bilýän adam. Biz
Entity Manager
om bilen aragatnaşyk saklaýarys. Onda galan zat, muny nireden alyp bolýandygyna düşünmekdir
Entity Manager
? JPA spesifikasiýasynyň "7.2.2 Programma bilen dolandyrylýan kärhana dolandyryjysyny almak" bölümine görä ulanmalydyrys
EntityManagerFactory
. Şonuň üçin geliň, JPA spesifikasiýasy bilen ýaraglanalyň we “7.3.2 Java SE gurşawynda kärhana dolandyryjy zawodyny almak” bölüminden mysal alalyň we ýönekeý bölüm synagy görnüşinde format edeliň:
@Test
public void shouldStartHibernate() {
EntityManagerFactory emf = Persistence.createEntityManagerFactory( "JavaRush" );
EntityManager entityManager = emf.createEntityManager();
}
Bu synag eýýäm "Tanalmadyk JPA persistence.xml XSD wersiýasy" ýalňyşlygyny görkezer. Munuň sebäbi,
persistence.xml
"8.3 persistence.xml shema" bölüminde JPA spesifikasiýasynda aýdylyşy ýaly ulanmaly shemany dogry görkezmeli:
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"
version="2.2">
Mundan başga-da, elementleriň tertibi möhümdir. Şonuň üçin
provider
sapaklary sanamazdan ozal kesgitlenmeli. Ondan soň synag üstünlikli geçer. Göni JPA birikmesini tamamladyk. Geçmezden ozal, galan synaglar hakda pikir edeliň. Synaglarymyzyň her biri zerur bolar
EntityManager
.
EntityManager
Her synagyň ýerine ýetirilişiň başynda özüne degişlidigine göz ýetireliň . Mundan başga-da, maglumatlar bazasynyň her gezek täze bolmagyny isleýäris. Opsiýany ulanýandygymyz sebäpli
inmemory
ýapmak ýeterlikdir
EntityManagerFactory
. Dörediş
Factory
gymmat amal. Emma synaglar üçin dogry. JUnit, her synagyň ýerine ýetirilmeginden öň (Öň) we soň (soň) ýerine ýetiriljek usullary kesgitlemäge mümkinçilik berýär:
public class AppTest {
private EntityManager em;
@Before
public void init() {
EntityManagerFactory emf = Persistence.createEntityManagerFactory( "JavaRush" );
em = emf.createEntityManager();
}
@After
public void close() {
em.getEntityManagerFactory().close();
em.close();
}
EntityManagerFactory
Indi, islendik synagy geçirmezden ozal täze maglumatlar bazasynyň döredilmegine sebäp boljak täze dörediler , sebäbi
hibernate.hbm2ddl.auto
manysy bar
create
. Täze zawoddan bolsa täze zawod alarys
EntityManager
.
Kärhanalar
Rememberadymyzda bolsa, ozal domen modelimizi suratlandyrýan synplar döredipdik. Bularyň "özenlerimiz" bolandygyny eýýäm aýdypdyk. Bu ulanmagy dolandyrjak edara
EntityManager
. Bir kategoriýanyň manysyny saklamak üçin ýönekeý synag ýazalyň:
@Test
public void shouldPersistCategory() {
Category cat = new Category();
cat.setTitle("new category");
em.persist(cat);
}
Emma bu synag derrew işlemez, sebäbi ... guramalaryň nämedigine düşünmäge kömek etjek dürli ýalňyşlyklary alarys:
-
Unknown entity: hibernate.model.Category
Gibernate näme üçin Category
düşünmeýär entity
? Esasy zat, subýektler JPA standartyna laýyklykda beýan edilmeli. JPA spesifikasiýasynyň "2.1 Kärhana synpy" bölüminde aýdylyşy ýaly,
okuw sapaklary düşündiriş bilen ýazylmalydyr .@Entity
-
No identifier specified for entity: hibernate.model.Category
Kärhanalarda bir ýazgyny beýlekisinden tapawutlandyrmak üçin ulanyp boljak özboluşly kesgitleýji bolmaly.
JPA spesifikasiýasynyň "2.4 başlangyç açarlar we şahsyýetiň şahsyýeti" bölümine görä, "Her bir guramanyň esasy açary bolmaly", ýagny Her bir guramanyň "esasy açary" bolmaly. Şeýle esasy açar düşündiriş bilen görkezilmelidir@Id
-
ids for this class must be manually assigned before calling save()
Şahsyýetnama bir ýerden gelmeli. El bilen kesgitläp bolýar ýa-da awtomatiki usulda alyp bolýar.
Şonuň üçin "11.2.3.3 GeneratedValue" we "11.1.20 GeneratedValue Annotation" bölümlerinde görkezilişi ýaly, düşündirişi kesgitläp bileris @GeneratedValue
.
Şonuň üçin kategoriýa synpynyň bir gurama bolmagy üçin aşakdaky üýtgeşmeleri etmeli:
@Entity
public class Category {
@Id
@GeneratedValue
private Long id;
Mundan başga-da, düşündiriş
@Id
haýsysyny ulanmalydygyny görkezýär
Access Type
. Giriş görnüşi barada has giňişleýin JPA spesifikasiýasynda, "2.3 Giriş görnüşi" bölüminde okap bilersiňiz. Gysgaça aýtsam, sebäbi ...
@Id
() meýdanyndan ýokarda kesgitledik
field
, şonda giriş görnüşi deslapky bolar
field-based
, däl
property-based
. Şonuň üçin JPA üpjün edijisi bahalary göni meýdanlardan okar we saklar.
@Id
Eger alyjynyň üstünde goýsak ,
property-based
giriş ulanylar, ýagny getter we setter arkaly. Synag geçirilende maglumatlar bazasyna haýsy haýyşlaryň iberilendigini hem görýäris (opsiýa sebäpli
hibernate.show_sql
). Savingöne tygşytlanda, hiç zady göremzok
insert
. Aslynda hiç zady tygşytlamadykmy? JPA usuly ulanyp, tutanýerlilik kontekstini we maglumat bazasyny sinhronlamaga mümkinçilik berýär
flush
:
entityManager.flush();
Nowöne indi ýerine ýetirsek, ýalňyşlyk alarys:
hiç hili amal dowam etmeýär . Indi JPA-nyň amallary nähili ulanýandygyny öwrenmegiň wagty geldi.
JPA amallary
.Adymyzda bolsa, JPA tutanýerlilik kontekstine esaslanýar. Bu subýektleriň ýaşaýan ýeri. Biz subýektleri dolandyrýarys
EntityManager
. Buýrugy ýerine ýetirenimizde
persist
, guramany kontekstde ýerleşdirýäris. Has takygy,
EntityManager
munuň edilmelidigini aýdýarys. Emma bu kontekst diňe käbir saklanýan ýer. Hatda käwagt "birinji derejeli keş" diýilýär. Emma maglumatlar bazasyna birikdirilmeli. Öň ýalňyşlyk bilen başa barmadyk buýruk
flush
, tutanýerlilik kontekstindäki maglumatlary maglumatlar bazasy bilen sinhronlaýar. Thisöne munuň üçin ulag gerek we bu ulag geleşikdir. JPA-daky geleşikler spesifikasiýanyň "7.5 Dolandyryş amallary" bölüminde beýan edilýär. JPA-da amallary ulanmak üçin ýörite API bar:
entityManager.getTransaction().begin();
entityManager.getTransaction().commit();
Synaglardan öň we soň işleýän kodumyza amal dolandyryşyny goşmaly:
@Before
public void init() {
EntityManagerFactory emf = Persistence.createEntityManagerFactory( "JavaRush" );
em = emf.createEntityManager();
em.getTransaction().begin();
}
@After
public void close() {
if (em.getTransaction().isActive()) {
em.getTransaction().commit();
}
em.getEntityManagerFactory().close();
em.close();
}
Goşandan soň, goýmak gündeliginde SQL-de öň bolmadyk bir aňlatmany göreris:
Geleşikde toplanan üýtgeşmeler
EntityManager
maglumatlar bazasynda edildi (tassyklandy we saklandy). Geliň indi öz manymyzy tapmaga synanyşalyň. Geliň, şahsyýeti boýunça bir zady gözlemek üçin synag döredeliň:
@Test
public void shouldFindCategory() {
Category cat = new Category();
cat.setTitle("test");
em.persist(cat);
Category result = em.find(Category.class, 1L);
assertNotNull(result);
}
Bu ýagdaýda ozal saklan guramamyzy alarys, ýöne SELECT talaplaryny gündeliginde görmeris. Hemme zat biziň aýdýanlarymyza esaslanýar: "Kärhananyň dolandyryjysy, maňa ID = 1 kategoriýa bölümini tapmagyňyzy haýyş edýäris." Gurama dolandyryjysy ilki bilen öz kontekstine seredýär (keş görnüşini ulanýar) we diňe tapmasa, maglumatlar bazasyna göz aýlaýar. Şahsyýetnamany 2-e üýtgetmeli (beýle zat ýok, diňe 1 mysal sakladyk) we
SELECT
haýyşyň peýda bolandygyny göreris. Kontekstde hiç bir gurama tapylmady we
EntityManager
maglumatlar binýady bir guramany tapmaga synanyşýar. Kontekstde bir guramanyň ýagdaýyna gözegçilik etmek üçin ulanyp boljak dürli buýruklar bar. Bir guramanyň bir döwletden beýlekisine geçmegine guramanyň ýaşaýyş sikli diýilýär -
lifecycle
.
Kärhananyň ömri
Jisimleriň ýaşaýyş sikli, JPA spesifikasiýasynda "3.2 Entity Instance's Life Cycle" bölüminde beýan edilýär. Sebäbi subýektler kontekstde ýaşaýarlar we gözegçilikde saklaýarlar
EntityManager
, soň bolsa subýektleriň gözegçilik edilýändigini aýdýarlar. dolandyryldy. Bir guramanyň durmuşynyň tapgyrlaryna seredeliň:
Category cat = new Category();
cat.setTitle("new category");
entityManager.persist(cat);
entityManager.getTransaction().begin();
entityManager.getTransaction().commit();
entityManager.detach(cat);
Category managed = entityManager.merge(cat);
entityManager.remove(managed);
Ony berkitmek üçin diagramma:
Kartalaşdyrmak
JPA-da subýektleriň biri-biri bilen gatnaşyklaryny suratlandyryp bileris. Domen modelimiz bilen iş salyşanymyzda, eýýäm subýektleriň biri-biri bilen gatnaşyklaryna seredendigimizi ýadyňyzdan çykarmaň.
Soňra “quickdatabasediagrams.com” çeşmesini ulandyk :
Edaralaryň arasynda baglanyşyk gurmak kartalaşdyrmak ýa-da birleşme (Assosiasiýa kartalary) diýilýär. JPA ulanyp döredilip bilinjek birleşmeleriň görnüşleri aşakda görkezilýär:
Topic
Bir mowzugy suratlandyrýan bir gurama seredeliň .
Topic
Oňa bolan garaýyş barada näme aýdyp bileris
Category
? Köpüsi
Topic
bir kategoriýa degişlidir. Şonuň üçin birleşme gerek
ManyToOne
. Geliň, bu gatnaşygy JPA-da beýan edeliň:
@ManyToOne
@JoinColumn(name = "category_id")
private Category category;
Haýsy bellikleri goýmalydygyny ýada salmak üçin, soňky bölümiň düşündirişiň görkezilen meýdany üçin jogapkärdigini ýadyňyzdan çykaryp bilersiňiz.
ToOne
- anyk mysal.
ToMany
- ýygyndylar. Indi biziň baglanyşygymyz bir taraply. Geliň, iki taraplaýyn aragatnaşyk edeliň. Geliň , bu kategoriýa girenleriň
Category
hemmesi baradaky bilimlere goşalyň .
Topic
Munuň bilen gutarmaly
ToMany
, sebäbi sanawymyz bar
Topic
. .Agny, “Köplere” garaýyş. Sorag galýar -
OneToMany
ýa-da
ManyToMany
:
Şol bir mowzuk boýunça gowy jogaby şu ýerden okap bilersiňiz: "
ORM oneToMany, bäş ýaşym ýaly köp adam gatnaşyklaryny düşündiriň ". Bir kategoriýanyň mowzuklar bilen baglanyşygy bar bolsa , bu mowzuklaryň hersinde diňe bir kategoriýa bolup biler , başgaça
ToMany
bolar . Şeýlelikde, ähli mowzuklaryň sanawy şeýle bolar:
One
Many
Category
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "topic_id")
private Set<Topic> topics = new HashSet<>();
Category
Hemme mowzuklaryň sanawyny almak üçin esasan ýazyjy ýazmagy ýatdan çykarmalyň :
public Set<Topic> getTopics() {
return this.topics;
}
Iki taraplaýyn gatnaşyklar awtomatiki yzarlamak gaty kyn zat. Şonuň üçin JPA bu jogapkärçiligi döredijä geçirýär.
Topic
Bu biziň üçin nämäni aňladýar, haýsydyr bir gurama bilen gatnaşyk guranymyzda
Category
, maglumatlaryň yzygiderliligini özümiz üpjün etmeli. Bu ýönekeý ýerine ýetirilýär:
public void setCategory(Category category) {
category.getTopics().add(this);
this.category = category;
}
Barlamak üçin ýönekeý synag ýazalyň:
@Test
public void shouldPersistCategoryAndTopics() {
Category cat = new Category();
cat.setTitle("test");
Topic topic = new Topic();
topic.setTitle("topic");
topic.setCategory(cat);
em.persist(cat);
}
Kartalaşdyrmak düýbünden başga mowzuk. Bu synyň maksady, munuň gazanylýan serişdelerine düşünmekdir. Kartalaşdyrmak barada has giňişleýin maglumaty şu ýerden okap bilersiňiz:
JPQL
JPA gyzykly gural - Java erjellik talaplary dilindäki talaplar bilen tanyşdyrýar. Bu dil SQL-e meňzeýär, ýöne SQL tablisalary däl-de, Java obýekt modelini ulanýar. Bir mysala seredeliň:
@Test
public void shouldPerformQuery() {
Category cat = new Category();
cat.setTitle("query");
em.persist(cat);
Query query = em.createQuery("SELECT c from Category c WHERE c.title = 'query'");
assertNotNull(query.getSingleResult());
}
Görşümiz ýaly, talapda
Category
tablisa däl-de, bir gurama salgylanma ulandyk. Şeýle hem bu guramanyň meýdançasynda
title
. JPQL köp peýdaly aýratynlyklary hödürleýär we öz makalasyna mynasyp. Has giňişleýin maglumaty synda tapyp bilersiňiz:
Kriteriýalar API
Ahyrynda, Criteria API-e degmek isleýärin. JPA dinamiki talap gurluşyk guralyny hödürleýär. Criteria API ulanmagyň mysaly:
@Test
public void shouldFindWithCriteriaAPI() {
Category cat = new Category();
em.persist(cat);
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Category> query = cb.createQuery(Category.class);
Root<Category> c = query.from(Category.class);
query.select(c);
List<Category> resultList = em.createQuery(query).getResultList();
assertEquals(1, resultList.size());
}
Bu mysal, haýyşy ýerine ýetirmek bilen deňdir
SELECT c FROM Category c
.
“Criteria API” güýçli guraldyr. Bu hakda has giňişleýin maglumaty şu ýerden okap bilersiňiz:
Netije
Görşümiz ýaly, JPA köp sanly aýratynlyklary we gurallary hödürleýär. Olaryň her biri tejribe we bilim talap edýär. JPA synynyň çäginde-de hemme zady ýatlamak, jikme-jik çümmek hakda aýtmazlyk mümkin däldi. Itöne ony okanymdan soň ORM we JPA-nyň nämedigi, nähili işleýändigi we näme bilen edilip bilinjekdigi has aýdyň boldy diýip umyt edýärin. Nahar üçin dürli materiallary hödürleýärin:
# Wiaçeslaw
GO TO FULL VERSION