JavaRush /Java Blog /Random-TK /JPA: Tehnologiýa bilen tanyşdyrmak
Viacheslav
Dereje

JPA: Tehnologiýa bilen tanyşdyrmak

Toparda çap edildi
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.
JPA: Tehnologiýa giriş - 1

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: JPA: Tehnologiýa giriş - 2ORM 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.
JPA: Tehnologiýa giriş - 3

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 JPA: Tehnologiýa giriş - 4 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ň, Topicbir 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: Tehnologiýa giriş - 5

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.
JPA: Tehnologiýa giriş - 6
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 Managerom 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 providersapaklary 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. EntityManagerHer 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ş Factorygymmat 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();
    }
EntityManagerFactoryIndi, islendik synagy geçirmezden ozal täze maglumatlar bazasynyň döredilmegine sebäp boljak täze dörediler , sebäbi hibernate.hbm2ddl.automanysy bar create. Täze zawoddan bolsa täze zawod alarys EntityManager.
JPA: Tehnologiýa giriş - 7

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");
	// JUnit обеспечит тест свежим EntityManager'ом
	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 Categorydüşü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ş @Idhaý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. @IdEger alyjynyň üstünde goýsak , property-basedgiriş 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: Tehnologiýa giriş - 8

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, EntityManagermunuň 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:
JPA: Tehnologiýa giriş - 9
Geleşikde toplanan üýtgeşmeler EntityManagermaglumatlar 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 SELECThaýyşyň peýda bolandygyny göreris. Kontekstde hiç bir gurama tapylmady we EntityManagermaglumatlar 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.
JPA: Tehnologiýa giriş - 10

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ň:
// 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);
Ony berkitmek üçin diagramma:
JPA: Tehnologiýa giriş - 11
JPA: Tehnologiýa giriş - 12

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 :
JPA: Tehnologiýa giriş - 13
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:
JPA: Tehnologiýa giriş - 14
TopicBir mowzugy suratlandyrýan bir gurama seredeliň . TopicOňa bolan garaýyş barada näme aýdyp bileris Category? Köpüsi Topicbir 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ň Categoryhemmesi baradaky bilimlere goşalyň . TopicMunuň bilen gutarmaly ToMany, sebäbi sanawymyz bar Topic. .Agny, “Köplere” garaýyş. Sorag galýar - OneToManyýa-da ManyToMany:
JPA: Tehnologiýa giriş - 15
Ş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 ToManybolar . Şeýlelikde, ähli mowzuklaryň sanawy şeýle bolar: OneManyCategory
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "topic_id")
private Set<Topic> topics = new HashSet<>();
CategoryHemme 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. TopicBu 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:
JPA: Tehnologiýa giriş - 16

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 Categorytablisa 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:
JPA: Tehnologiýa giriş - 17

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
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION