JavaRush /Java блогы /Random-KK /JPA: Технологияны енгізу
Viacheslav
Деңгей

JPA: Технологияны енгізу

Топта жарияланған
Заманауи даму әлемі өмірді жеңілдетуге арналған әртүрлі сипаттамаларға толы. Құралдарды біле отырып, сіз дұрыс таңдай аласыз. Білмей-ақ өміріңізді қиындата аласыз. Бұл шолу JPA - Java Persistence API концепциясының құпиялылығын жояды. Оқығаннан кейін осы жұмбақ әлемге тереңірек сүңгігіңіз келеді деп сенемін.
JPA : Технологияға кіріспе - 1

Кіріспе

Белгілі болғандай, бағдарламалардың негізгі міндеттерінің бірі мәліметтерді сақтау және өңдеу болып табылады. Бұрынғы жақсы күндерде адамдар деректерді файлдарда сақтаған. Бірақ бір уақытта оқуға және өңдеуге рұқсат қажет болған кезде, жүктеме болған кезде (яғни, бір уақытта бірнеше сұраулар келіп түседі), деректерді жай файлдарда сақтау проблемаға айналады. Мәліметтер қоры қандай мәселелерді және қалай шешетіні туралы қосымша ақпарат алу үшін мен сізге « Дерекқорлар қалай құрылымдалған » мақаласын оқуға кеңес беремін . Бұл біздің деректерімізді дерекқорда сақтауды шешкенімізді білдіреді. Ұзақ уақыт бойы Java JDBC API (The Java Database Connectivity) көмегімен дерекқорлармен жұмыс істей алды. JDBC туралы толығырақ мына жерден оқи аласыз: " JDBC немесе бәрі қайдан басталады ." Бірақ уақыт өтті және әзірлеушілер Java нысандарын дерекқорда сақтаудың тривиальды операциялары үшін және керісінше, Java нысандарын жасау үшін бірдей типті және қажетсіз «техникалық қызмет көрсету» codeын (Бойлерплата деп аталатын code) жазу қажеттілігіне тап болды. дерекқор. Содан кейін осы мәселелерді шешу үшін ORM сияқты тұжырымдама пайда болды. ORM - Объект-Реляциялық карта немесе орыс тіліне аударылған an object-реляциялық карта. Бұл дерекқорды an objectілі-бағытталған бағдарламалау тілдерінің ұғымдарымен байланыстыратын бағдарламалау технологиясы. Жеңілдету үшін ORM — Java нысандары мен дерекқордағы жазбалар арасындағы байланыс: JPA: Технологияға кіріспе - 2ORM негізінен Java нысанын дерекқордағы деректер ретінде көрсетуге болатын тұжырымдама (және керісінше). Ол JPA спецификациясы түрінде іске асырылды - Java Persistence API. Спецификация қазірдің өзінде осы тұжырымдаманы білдіретін Java API сипаттамасы болып табылады. Техникалық сипаттама ORM тұжырымдамасына сәйкес жұмыс істеу үшін бізге қандай құралдармен қамтамасыз ету керектігін айтады (яғни, қандай интерфейстер арқылы жұмыс істей аламыз). Және бұл қаражатты қалай пайдалану керек. Техникалық сипаттама құралдардың орындалуын сипаттамайды. Бұл бір спецификация үшін әртүрлі енгізулерді пайдалануға мүмкіндік береді. Сіз оны жеңілдете аласыз және спецификация API сипаттамасы деп айта аласыз. JPA спецификациясының мәтінін Oracle веб-сайтында табуға болады: " JSR 338: JavaTM Persistence API ". Сондықтан, JPA пайдалану үшін бізге технологияны қолданатын кейбір енгізу қажет. JPA іске асырулары JPA провайдерлері деп те аталады. Ең танымал JPA енгізулерінің бірі - Hibernate . Сондықтан мен оны қарастыруды ұсынамын.
JPA: Технологияға кіріспе - 3

Жоба құру

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 JPA: Технологияға кіріспе – 4 Мұнда біз сипаттаған нәрсе біздің «домен үлгісі» екенін айта кеткен жөн. Домен – бұл «пән аймағы». Жалпы, домен латын тілінен аударғанда «иелену» болып табылады. Орта ғасырларда патшалардың немесе феодалдардың иелігіндегі аймақтар осылай аталды. Ал француз тілінде бұл жай ғана «аудан» деп аударылатын «домен» сөзіне айналды. Осылайша, біз «домен үлгісін» = «пән үлгісін» сипаттадық. Бұл модельдің әрбір элементі нақты өмірден алынған қандай да бір «мән» болып табылады. Біздің жағдайда бұл нысандар: Санат ( 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: Технологияға кіріспе - 5

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: Технологияға кіріспе - 6
« » тарауындағы 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.
JPA: Технологияға кіріспе - 7

Субъектілер

Естеріңізде болса, біз бұрын домен үлгісін сипаттайтын сыныптар жасағанбыз. Бұл біздің «мәніміз» екенін жоғарыда айттық. Бұл біз басқаратын нысан EntityManager. Санаттың мәнін сақтау үшін қарапайым тест жазайық:
@Test
public void shouldPersistCategory() {
	Category cat = new Category();
	cat.setTitle("new category");
	// JUnit обеспечит тест свежим EntityManager'ом
	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-basedproperty-based@Idproperty-basedhibernate.show_sqlinsertflush
entityManager.flush();
Бірақ егер біз оны қазір орындасақ, қате пайда болады: ешқандай транзакция орындалмайды . Енді JPA транзакцияларды қалай қолданатынын білудің уақыты келді.
JPA: Технологияға кіріспе – 8

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 өрнекті көреміз:
JPA: Технологияға кіріспе – 9
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: Технологияға кіріспе – 10

Нысанның өмірлік циклі

Нысандардың өмірлік циклі JPA спецификациясында «3.2 Нысан данасы өмірлік циклі» тарауында сипатталған. Өйткені субъектілер контексте өмір сүреді және арқылы басқарылады EntityManager, содан кейін олар субъектілер басқарылады деп айтады, яғни. басқарған. Субъект өмірінің кезеңдерін қарастырайық:
// 1. New or Transient (временный)
Category cat = new Category();
cat.setTitle("new category");
// 2. Managed or Persistent
entityManager.persist(cat);
// 3. Транзакция завершена, все сущности в контексте detached
entityManager.getTransaction().begin();
entityManager.getTransaction().commit();
// 4. Сущность изымаем из контекста, она становится detached
entityManager.detach(cat);
// 5. Сущность из detached можно снова сделать managed
Category managed = entityManager.merge(cat);
// 6. И можно сделать Removed. Интересно, что cat всё равно detached
entityManager.remove(managed);
Міне, оны біріктіру үшін диаграмма:
JPA: Технологияға кіріспе - 11
JPA: Технологияға кіріспе – 12

Картаға түсіру

JPA-да біз субъектілердің бір-бірімен қарым-қатынасын сипаттай аламыз. Біз домен үлгісін қарастырған кезде бір-біріміздегі нысандардың қарым-қатынасын қарастырғанымызды еске түсірейік. Содан кейін біз quickdatabasediagrams.com ресурсын қолдандық :
JPA: Технологияға кіріспе – 13
Нысандар арасында байланыс орнатуды салыстыру немесе ассоциация деп атайды (Association Mappings). JPA көмегімен құруға болатын бірлестіктердің түрлері төменде берілген:
JPA : Технологияға кіріспе - 14
TopicТақырыпты сипаттайтын нысанды қарастырайық . Topicқатынасы туралы не айтуға болады Category? Көбісі Topicбір санатқа жатады. Сондықтан бізге қауымдастық керек ManyToOne. Бұл қатынасты JPA-де көрсетейік:
@ManyToOne
@JoinColumn(name = "category_id")
private Category category;
Қандай annotationларды қою керектігін есте сақтау үшін, соңғы бөлік жоғарыда annotation көрсетілген өріске жауапты екенін есте сақтаңыз. ToOne- нақты мысал. ToMany- жинақтар. Қазір біздің байланысымыз бір жақты. Оны екі жақты байланысқа айналдырайық. Осы санатқа кіретіндердің Categoryбарлығы туралы білімге қосайық . TopicБұл аяқталуы керек ToMany, өйткені бізде тізім бар Topic. Яғни, «Көптеген тақырыптарға» қатынас. Сұрақ қалады - OneToManyнемесе ManyToMany:
JPA: Технологияға кіріспе – 15
Дәл осы тақырып бойынша жақсы жауапты мына жерден оқуға болады: " 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);
}
Карта жасау - бұл бөлек тақырып. Бұл шолудың мақсаты - оған қол жеткізудің әдістерін түсіну. Карта жасау туралы толығырақ мына жерден оқи аласыз:
JPA : Технологияға кіріспе - 16

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 көптеген пайдалы мүмкіндіктерді қамтамасыз етеді және өз мақаласына лайық. Толық мәліметтерді шолудан табуға болады:
JPA : Технологияға кіріспе - 17

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 деген не, олар қалай жұмыс істейді және онымен не істеуге болатыны түсінікті болды деп үміттенемін. Ал, тағамдар үшін мен әртүрлі материалдарды ұсынамын: #Вячеслав
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION