Заманауи даму әлемі өмірді жеңілдетуге арналған әртүрлі сипаттамаларға толы. Құралдарды біле отырып, сіз дұрыс таңдай аласыз. Білмей-ақ өміріңізді қиындата аласыз. Бұл шолу JPA - Java Persistence API концепциясының құпиялылығын жояды. Оқығаннан кейін осы жұмбақ әлемге тереңірек сүңгігіңіз келеді деп сенемін.
Кіріспе
Белгілі болғандай, бағдарламалардың негізгі міндеттерінің бірі мәліметтерді сақтау және өңдеу болып табылады. Бұрынғы жақсы күндерде адамдар деректерді файлдарда сақтаған. Бірақ бір уақытта оқуға және өңдеуге рұқсат қажет болған кезде, жүктеме болған кезде (яғни, бір уақытта бірнеше сұраулар келіп түседі), деректерді жай файлдарда сақтау проблемаға айналады.
Мәліметтер қоры қандай мәселелерді және қалай шешетіні туралы қосымша ақпарат алу үшін мен сізге « Дерекқорлар қалай құрылымдалған » мақаласын оқуға кеңес беремін . Бұл біздің деректерімізді дерекқорда сақтауды шешкенімізді білдіреді. Ұзақ уақыт бойы Java JDBC API (The Java Database Connectivity) көмегімен дерекқорлармен жұмыс істей алды. JDBC туралы толығырақ мына жерден оқи аласыз: "
JDBC немесе бәрі қайдан басталады ." Бірақ уақыт өтті және әзірлеушілер Java нысандарын дерекқорда сақтаудың тривиальды операциялары үшін және керісінше, Java нысандарын жасау үшін бірдей типті және қажетсіз «техникалық қызмет көрсету» codeын (Бойлерплата деп аталатын code) жазу қажеттілігіне тап болды. дерекқор. Содан кейін осы мәселелерді шешу үшін ORM сияқты тұжырымдама пайда болды.
ORM - Объект-Реляциялық карта немесе орыс тіліне аударылған an object-реляциялық карта. Бұл дерекқорды an objectілі-бағытталған бағдарламалау тілдерінің ұғымдарымен байланыстыратын бағдарламалау технологиясы. Жеңілдету үшін ORM — Java нысандары мен дерекқордағы жазбалар арасындағы байланыс:
ORM негізінен Java нысанын дерекқордағы деректер ретінде көрсетуге болатын тұжырымдама (және керісінше). Ол JPA спецификациясы түрінде іске асырылды - Java Persistence API. Спецификация қазірдің өзінде осы тұжырымдаманы білдіретін Java API сипаттамасы болып табылады. Техникалық сипаттама ORM тұжырымдамасына сәйкес жұмыс істеу үшін бізге қандай құралдармен қамтамасыз ету керектігін айтады (яғни, қандай интерфейстер арқылы жұмыс істей аламыз). Және бұл қаражатты қалай пайдалану керек. Техникалық сипаттама құралдардың орындалуын сипаттамайды. Бұл бір спецификация үшін әртүрлі енгізулерді пайдалануға мүмкіндік береді. Сіз оны жеңілдете аласыз және спецификация API сипаттамасы деп айта аласыз. JPA спецификациясының мәтінін Oracle веб-сайтында табуға болады: "
JSR 338: JavaTM Persistence API ". Сондықтан, JPA пайдалану үшін бізге технологияны қолданатын кейбір енгізу қажет. JPA іске асырулары JPA провайдерлері деп те аталады. Ең танымал JPA енгізулерінің бірі -
Hibernate . Сондықтан мен оны қарастыруды ұсынамын.
Жоба құру
JPA Java туралы болғандықтан, бізге Java жобасы қажет болады. Біз каталог құрылымын қолмен жасай аламыз және қажетті кітапханаларды өзіміз қоса аламыз. Бірақ жобаларды құрастыруды автоматтандыру жүйелерін пайдалану әлдеқайда ыңғайлы және дұрыс (яғни, бұл біз үшін жобаларды құрастыруды басқаратын бағдарлама ғана. Анықтамалықтарды жасаңыз, сынып жолына қажетті кітапханаларды қосыңыз және т.б. .). Осындай жүйелердің бірі - Gradle. Gradle туралы толығырақ мына жерден оқи аласыз: "
Gradle туралы қысқаша кіріспе ". Біз білетіндей, Gradle функционалдығы (яғни, ол жасай алатын нәрселер) әртүрлі Gradle Plugins көмегімен жүзеге асырылады.
Gradle және " Gradle Build Init Plugin " плагинін қолданайық . Пәрменді орындаймыз:
gradle init --type java-application
Gradle біз үшін қажетті каталог құрылымын жасайды және құрастыру сценарийінде жобаның негізгі декларативті сипаттамасын жасайды
build.gradle
. Сонымен, бізде өтініш бар. Біз қолданбамызбен нені сипаттағымыз немесе модельдегіміз келетіні туралы ойлануымыз керек. Кейбір модельдеу құралын қолданайық, мысалы:
app.quickdatabasediagrams.com Мұнда біз сипаттаған нәрсе біздің «домен үлгісі» екенін айта кеткен жөн. Домен – бұл «пән аймағы». Жалпы, домен латын тілінен аударғанда «иелену» болып табылады. Орта ғасырларда патшалардың немесе феодалдардың иелігіндегі аймақтар осылай аталды. Ал француз тілінде бұл жай ғана «аудан» деп аударылатын «домен» сөзіне айналды. Осылайша, біз «домен үлгісін» = «пән үлгісін» сипаттадық. Бұл модельдің әрбір элементі нақты өмірден алынған қандай да бір «мән» болып табылады. Біздің жағдайда бұл нысандар: Санат (
Category
), Тақырып (
Topic
). Нысандар үшін бөлек бума жасайық, мысалы, атау үлгісімен. Онда нысандарды сипаттайтын Java сыныптарын қосамыз. Java codeында мұндай нысандар әдеттегі
POJO болып табылады , ол келесідей болуы мүмкін:
public class Category {
private Long id;
private String title;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
Класстың мазмұнын көшіріп алып, аналогия бойынша класс құрайық
Topic
. Ол тек қай санатқа жататындығы туралы білетінімен ғана ерекшеленетін болады.
Topic
Сондықтан сыныпқа санат өрісін және онымен жұмыс істеу әдістерін қосамыз :
private Category category;
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
Енді бізде өзінің домен үлгісі бар Java қолданбасы бар. Енді JPA жобасына қосылуды бастау уақыты келді.
JPA қосу
Сонымен, есімізде болса, JPA дерекқорда бір нәрсені сақтайтынымызды білдіреді. Сондықтан бізге мәліметтер базасы қажет. Жобамызда дерекқор қосылымын пайдалану үшін дерекқорға қосылу үшін тәуелділік кітапханасын қосу керек. Естеріңізде болса, біз Gradle қолдандық, ол біз үшін құрастыру сценарийін жасады
build.gradle
. Онда біз жобамызға қажет тәуелділіктерді сипаттайтын боламыз. Тәуелділіктер - бұл біздің codeсыз жұмыс істей алмайтын кітапханалар. Мәліметтер қорына қосылуға тәуелділікті сипаттаудан бастайық. Біз мұны JDBC-мен жұмыс жасасақ, дәл солай жасаймыз:
dependencies {
implementation 'com.h2database:h2:1.4.199'
Қазір бізде мәліметтер базасы бар. Енді біз Java нысандарын дерекқор концепцияларына (Java-дан SQL-ге дейін) салыстыруға жауап беретін қосымшамызға қабат қоса аламыз. Естеріңізде болса, біз бұл үшін Hibernate деп аталатын JPA спецификациясының іске асырылуын қолданамыз:
dependencies {
implementation 'com.h2database:h2:1.4.199'
implementation 'org.hibernate:hibernate-core:5.4.2.Final'
Енді біз JPA конфигурациялауымыз керек. Егер біз "8.1 тұрақтылық бірлігі" спецификациясын және бөлімін оқысақ, тұрақтылық бірлігі конфигурациялардың, метадеректер мен нысандардың қандай да бір тіркесімі екенін білеміз. JPA жұмыс істеуі үшін конфигурация файлында кем дегенде бір тұрақтылық бірлігін сипаттау керек, ол деп аталады
persistence.xml
. Оның орны спецификация тарауында сипатталған «8.2 Тұрақтылық бірлігі орау». Осы бөлімге сәйкес, егер бізде Java SE ортасы болса, оны META-INF каталогының түбіріне қою керек.
« » тарауындағы JPA спецификациясында келтірілген мысалдан мазмұнды көшіріп алайық
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>
Бірақ бұл жеткіліксіз. Біз JPA провайдеріміздің кім екенін айтуымыз керек, яғни. JPA спецификациясын жүзеге асыратын адам:
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
Енді параметрлерді қосамыз (
properties
). Олардың кейбіреулері (-ден бастап
javax.persistence
) стандартты JPA конфигурациялары болып табылады және «8.2.1.9 сипаттары» бөліміндегі JPA спецификациясында сипатталған. Кейбір конфигурациялар провайдерге тән (біздің жағдайда олар Hibernate күйіне Jpa провайдері ретінде әсер етеді. Біздің параметрлер блогы келесідей болады:
<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>
Қазір бізде JPA-үйлесімді конфигурация бар
persistence.xml
, JPA провайдері Hibernate және H2 дерекқоры бар, сонымен қатар біздің домен үлгісі болып табылатын 2 сынып бар. Ақырында мұның барлығын орындайық. Каталогта
/test/java
біздің Gradle бірлік сынақтары үшін үлгіні жасап шығарды және оны AppTest деп атады. Қолданайық. JPA спецификациясының "7.1 Тұрақтылық контексттері" тарауында айтылғандай, JPA әлеміндегі нысандар тұрақтылық контексті деп аталатын кеңістікте тұрады. Бірақ біз Persistence контекстімен тікелей жұмыс істемейміз. Ол үшін біз
Entity Manager
«нұсқа менеджерін» пайдаланамыз. Ол контекст туралы және онда қандай нысандар өмір сүретінін біледі. Біз 'оммен әрекеттесеміз
Entity Manager
. Сонда мұны қайдан алуға болатынын түсіну ғана қалады
Entity Manager
? JPA спецификациясының "7.2.2 Қолданбамен басқарылатын нысан менеджерін алу" тарауына сәйкес біз пайдалануымыз керек
EntityManagerFactory
. Сондықтан JPA спецификациясымен қаруланайық және «7.3.2 Java SE ортасында ұйым менеджерінің зауытын алу» тарауынан мысал алып, оны қарапайым Unit сынағы түрінде пішімдейік:
@Test
public void shouldStartHibernate() {
EntityManagerFactory emf = Persistence.createEntityManagerFactory( "JavaRush" );
EntityManager entityManager = emf.createEntityManager();
}
Бұл сынақ "Танылмаған JPA persistence.xml XSD нұсқасы" қатесін көрсетеді. Себебі,
persistence.xml
"8.3 persistence.xml схемасы" бөліміндегі JPA спецификациясында айтылғандай, пайдаланылатын схеманы дұрыс көрсету керек:
<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">
Сонымен қатар, элементтердің реті маңызды. Сондықтан
provider
сыныптарды тізбестен бұрын оны нақтылау керек. Осыдан кейін сынақ сәтті өтеді. Біз тікелей JPA қосылымын аяқтадық. Әрі қарай қозғалмас бұрын, қалған сынақтар туралы ойланайық. Біздің әрбір тестіміз қажет болады
EntityManager
.
EntityManager
Орындаудың басында әрбір сынақтың өзіндік болуын қамтамасыз етейік . Сонымен қатар, біз деректер базасының әр уақытта жаңа болуын қалаймыз. Біз опцияны қолданатындықтан
inmemory
, жабу жеткілікті
EntityManagerFactory
. Жасау
Factory
- қымбат операция. Бірақ сынақтар үшін бұл негізделген. JUnit әрбір сынақты орындауға дейін (бұрын) және кейін (кейін) орындалатын әдістерді көрсетуге мүмкіндік береді:
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
, ол жаңа дерекқорды құруды талап етеді, өйткені
hibernate.hbm2ddl.auto
мағынасы бар
create
. Ал жаңа зауыттан жаңасын аламыз
EntityManager
.
Субъектілер
Естеріңізде болса, біз бұрын домен үлгісін сипаттайтын сыныптар жасағанбыз. Бұл біздің «мәніміз» екенін жоғарыда айттық. Бұл біз басқаратын нысан
EntityManager
. Санаттың мәнін сақтау үшін қарапайым тест жазайық:
@Test
public void shouldPersistCategory() {
Category cat = new Category();
cat.setTitle("new category");
em.persist(cat);
}
Бірақ бұл сынақ бірден жұмыс істемейді, өйткені... біз қандай нысандар екенін түсінуге көмектесетін әртүрлі қателерді аламыз:
-
Unknown entity: hibernate.model.Category
Category
Неліктен күту күйі мұның не екенін түсінбейді entity
? Мәселе мынада, нысандар JPA стандартына сәйкес сипатталуы керек. JPA спецификациясының "2.1 Нысан класы" тарауында айтылғандай,
нысан сыныптары annotationмен түсіндірілуі керек .@Entity
-
No identifier specified for entity: hibernate.model.Category
Нысандарда бір жазбаны екіншісінен ажырату үшін пайдалануға болатын бірегей идентификатор болуы керек.
JPA спецификациясының «2.4 Бастапқы кілттер және нысан идентификациясы» тарауына сәйкес «Әрбір нысанның бастапқы кілті болуы керек», яғни. Әрбір нысанның «бастапқы кілті» болуы керек. Мұндай бастапқы кілт annotation арқылы көрсетілуі керек@Id
-
ids for this class must be manually assigned before calling save()
Жеке куәлік бір жерден келуі керек. Оны қолмен көрсетуге болады немесе автоматты түрде алуға болады.
Сондықтан, "11.2.3.3 Жасалған мән" және "11.1.20 Жасалған мән annotationсы" тарауларында көрсетілгендей, біз annotationны көрсете аламыз @GeneratedValue
.
Осылайша, санат класы нысан болуы үшін келесі өзгерістерді енгізуіміз керек:
@Entity
public class Category {
@Id
@GeneratedValue
private Long id;
Бұған қоса, annotation
@Id
қайсысын пайдалану керектігін көрсетеді
Access Type
. Қол жеткізу түрі туралы қосымша ақпаратты JPA спецификациясындағы «2.3 Қатынас түрі» бөлімінде оқи аласыз. Қысқаша айтқанда, өйткені...
@Id
біз жоғарыда ( ) өрісін белгіледік , онда кіру түрі емес,
field
әдепкі болады . Сондықтан JPA провайдері мәндерді тікелей өрістерден оқиды және сақтайды. Егер біз алушының үстіне орналастырсақ , онда кіру пайдаланылады, яғни. алушы және орнатушы арқылы. Сынақты іске қосқан кезде біз дерекқорға қандай сұраулар жіберілетінін де көреміз (опцияның арқасында ). Бірақ үнемдеу кезінде біз ешқайсысын көрмейміз . Біз ештеңені сақтамағанымыз белгілі болды ма? JPA келесі әдісті пайдаланып тұрақтылық контекстін және дерекқорды синхрондауға мүмкіндік береді :
field-based
property-based
@Id
property-based
hibernate.show_sql
insert
flush
entityManager.flush();
Бірақ егер біз оны қазір орындасақ, қате пайда болады:
ешқандай транзакция орындалмайды . Енді JPA транзакцияларды қалай қолданатынын білудің уақыты келді.
JPA транзакциялары
Естеріңізде болса, JPA табандылық контекстінің тұжырымдамасына негізделген. Бұл субъектілер тұратын жер. Біз нысандарды арқылы басқарамыз
EntityManager
. Біз пәрменді орындаған кезде
persist
нысанды контекстке орналастырамыз. Дәлірек айтқанда, біз
EntityManager
мұны істеу керек екенін айтамыз. Бірақ бұл контекст тек кейбір сақтау аймағы. Оны кейде «бірінші деңгейдегі кэш» деп те атайды. Бірақ ол дерекқорға қосылуы керек.
flush
Бұрын қатемен орындалмаған пәрмен тұрақтылық мәтінмәніндегі деректерді дерекқормен синхрондайды. Бірақ бұл көлікті қажет етеді және бұл көлік транзакция болып табылады. JPA-дағы операциялар спецификацияның "7.5 Бақылау операциялары" бөлімінде сипатталған. JPA транзакцияларын пайдалану үшін арнайы API бар:
entityManager.getTransaction().begin();
entityManager.getTransaction().commit();
Тесттерге дейін және кейін жұмыс істейтін codeымызға транзакцияны басқаруды қосу керек:
@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();
}
Қосқаннан кейін біз кірістіру журналында бұрын болмаған SQL өрнекті көреміз:
EntityManager
Мәліметтер базасында транзакцияда жинақталған өзгерістер жасалды (расталды және сақталды). Енді өз болмысымызды табуға тырысайық. Нысанды идентификаторы бойынша іздеу үшін сынақ жасайық:
@Test
public void shouldFindCategory() {
Category cat = new Category();
cat.setTitle("test");
em.persist(cat);
Category result = em.find(Category.class, 1L);
assertNotNull(result);
}
Бұл жағдайда біз бұрын сақталған нысанды аламыз, бірақ журналда ТАҢДАУ сұрауларын көрмейміз. Барлығы біздің айтқанымызға негізделген: «Нысан менеджері, маған ID=1 санаттағы нысанды тауып беріңізші». Ал нысан менеджері алдымен оның контекстіне қарайды (кэштің бір түрін пайдаланады), егер ол оны таппаса, дерекқорға барады. Идентификаторды 2-ге өзгерту керек (мұндай нәрсе жоқ, біз тек 1 дананы сақтадық) және біз
SELECT
сұраудың пайда болғанын көреміз. Өйткені контексте ешбір нысандар табылмады және
EntityManager
дерекқор нысанды табуға тырысуда.Мәтінмәндегі нысанның күйін басқару үшін пайдалана алатын әртүрлі пәрмендер бар. Заттың бір күйден екінші күйге өтуі субъектінің өмірлік циклі - деп аталады
lifecycle
.
Нысанның өмірлік циклі
Нысандардың өмірлік циклі JPA спецификациясында «3.2 Нысан данасы өмірлік циклі» тарауында сипатталған. Өйткені субъектілер контексте өмір сүреді және арқылы басқарылады
EntityManager
, содан кейін олар субъектілер басқарылады деп айтады, яғни. басқарған. Субъект өмірінің кезеңдерін қарастырайық:
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);
Міне, оны біріктіру үшін диаграмма:
Картаға түсіру
JPA-да біз субъектілердің бір-бірімен қарым-қатынасын сипаттай аламыз. Біз домен үлгісін қарастырған кезде бір-біріміздегі нысандардың қарым-қатынасын қарастырғанымызды еске түсірейік. Содан кейін біз
quickdatabasediagrams.com ресурсын қолдандық :
Нысандар арасында байланыс орнатуды салыстыру немесе ассоциация деп атайды (Association Mappings). JPA көмегімен құруға болатын бірлестіктердің түрлері төменде берілген:
Topic
Тақырыпты сипаттайтын нысанды қарастырайық .
Topic
қатынасы туралы не айтуға болады
Category
? Көбісі
Topic
бір санатқа жатады. Сондықтан бізге қауымдастық керек
ManyToOne
. Бұл қатынасты JPA-де көрсетейік:
@ManyToOne
@JoinColumn(name = "category_id")
private Category category;
Қандай annotationларды қою керектігін есте сақтау үшін, соңғы бөлік жоғарыда annotation көрсетілген өріске жауапты екенін есте сақтаңыз.
ToOne
- нақты мысал.
ToMany
- жинақтар. Қазір біздің байланысымыз бір жақты. Оны екі жақты байланысқа айналдырайық. Осы санатқа кіретіндердің
Category
барлығы туралы білімге қосайық .
Topic
Бұл аяқталуы керек
ToMany
, өйткені бізде тізім бар
Topic
. Яғни, «Көптеген тақырыптарға» қатынас. Сұрақ қалады -
OneToMany
немесе
ManyToMany
:
Дәл осы тақырып бойынша жақсы жауапты мына жерден оқуға болады: "
ORM oneToMany, manyToMany қатынасын менің бес жасымда сияқты түсіндіріңіз ". Егер санаттың тақырыптармен байланысы болса
ToMany
, онда бұл тақырыптардың әрқайсысында бір ғана категория болуы мүмкін, онда ол болады
One
, әйтпесе
Many
. Сонымен,
Category
барлық тақырыптардың тізімі келесідей болады:
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "topic_id")
private Set<Topic> topics = new HashSet<>();
Category
Барлық тақырыптардың тізімін алу үшін негізінен алушы жазуды ұмытпайық :
public Set<Topic> getTopics() {
return this.topics;
}
Екі жақты қатынастарды автоматты түрде қадағалау өте қиын нәрсе. Сондықтан JPA бұл жауапкершілікті әзірлеушіге жүктейді.
Topic
Бұл біз үшін мынаны білдіреді: -мен нысан қатынасын орнатқанда
Category
, деректердің сәйкестігін өзіміз қамтамасыз етуіміз керек. Бұл жай ғана жасалады:
public void setCategory(Category category) {
category.getTopics().add(this);
this.category = category;
}
Тексеру үшін қарапайым тест жазайық:
@Test
public void shouldPersistCategoryAndTopics() {
Category cat = new Category();
cat.setTitle("test");
Topic topic = new Topic();
topic.setTitle("topic");
topic.setCategory(cat);
em.persist(cat);
}
Карта жасау - бұл бөлек тақырып. Бұл шолудың мақсаты - оған қол жеткізудің әдістерін түсіну. Карта жасау туралы толығырақ мына жерден оқи аласыз:
JPQL
JPA қызықты құралды - Java Persistence Query Language тіліндегі сұрауларды ұсынады. Бұл тіл SQL тіліне ұқсас, бірақ SQL кестелерінен гөрі Java нысан үлгісін пайдаланады. Мысал қарастырайық:
@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());
}
Көріп отырғанымыздай, сұрауда кестеге
Category
емес, нысанға сілтеме қолданылды. Және де осы ұйымның өрісінде
title
. JPQL көптеген пайдалы мүмкіндіктерді қамтамасыз етеді және өз мақаласына лайық. Толық мәліметтерді шолудан табуға болады:
Criteria API
Соңында Criteria API-ге тоқталғым келеді. JPA динамикалық сұрау салу құралын ұсынады. Criteria API пайдалану мысалы:
@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());
}
Бұл мысал « » сұрауын орындауға тең
SELECT c FROM Category c
.
Criteria API қуатты құрал болып табылады. Бұл туралы толығырақ мына жерден оқи аласыз:
Қорытынды
Көріп отырғанымыздай, JPA көптеген мүмкіндіктер мен құралдарды ұсынады. Олардың әрқайсысы тәжірибе мен білімді талап етеді. Тіпті JPA шолуының аясында да егжей-тегжейлі сүңгуді айтпағанда, бәрін айту мүмкін болмады. Бірақ оны оқығаннан кейін ORM және JPA деген не, олар қалай жұмыс істейді және онымен не істеуге болатыны түсінікті болды деп үміттенемін. Ал, тағамдар үшін мен әртүрлі материалдарды ұсынамын:
#Вячеслав
GO TO FULL VERSION