JavaRush /Java Blog /Random-TK /JPA kärhanalary we DB gatnaşyklary
Nikita Koliadin
Dereje
Днепр

JPA kärhanalary we DB gatnaşyklary

Toparda çap edildi

JPA kärhanalary && DB gatnaşyklary

Günüňiz haýyrly, kärdeşler!
JPA kärhanalary we DB gatnaşyklary - 1
Bu material, maglumat bazalaryny guramak (mundan beýläk DB - "Maglumat bazasy"), Obýekt-baglanyşyk kartasynyň işleýşi (mundan beýläk ORM ) we Gibernate ýaly durmuşa geçirilmegi barada iň az bilimi bolanlar üçin niýetlenendir. / JPA . Bu zatlar bilen tanyş däl bolsaňyz, JDBC- den başlamagyňyzy we diňe ORM modeline geçmegi maslahat berýärin. Men size duýduryş berdim, bu makalany dogry taýýarlamazdan okanyňyzdan soň psihikanyňyz üçin jogapkärçilik çekmeýärin! :) Geliň, hemme zady tertipli edip başlalyň. Ilki bilen, teoriýa azajyk öwreneris. Ikinjiden, bu boky her kimiň halaýan Java-da nädip etmelidigini öwreneris. Mundan başga-da, mowzuga düşünişimizi berkitjek we nädip kartalaşdyrmagyň şablony bolup hyzmat etjek taslama-aldaw sahypasyny ýazarys . Geliň, muny edeliň!

Kärhana näme?

Kärhana , hakyky durmuşdan (mysal üçin, awtoulag) häsiýetleri bolan (gapylar, WHEELS , hereketlendiriji) obýektdir . DB guramasy: Bu ýagdaýda biziň guramamyz DB-de saklanýar, hemme zat ýönekeý. Maşyny näme üçin we nädip maglumat bazasyna salýarys - soňrak serederis.

DB gatnaşyklary näme?

Köp wagt mundan ozal, uzak patyşalykda baglanyşyk DB döredilipdi . Bu DB-de maglumatlar tablisa görnüşinde berildi. Emma Şrekden gelen eşek hem bu tablisalary birleşdirmegiň mehanizmini döretmegiň zerurdygyna düşündi. Netijede 4 DB gatnaşygy peýda boldy :
  1. -Eke-täk
  2. Bir-köp
  3. Köp-ýeke
  4. Köp-köp
Bularyň hemmesini ilkinji gezek görýän bolsaňyz, size ýene bir gezek duýduryş berýärin - hasam erbetleşer: gezelenje gitmek hakda pikir ediň. Bu gatnaşyklaryň hemmesini mysal ulanyp seljereris we olaryň arasyndaky tapawuda düşüneris.

Elhenç mysal

Bizde 5 şahamçasy boljak bir taslama bolar: ussat, bu ýerde taslamanyň beýany bolar we her DB gatnaşyklary üçin 1 şahamça. Her bölümde DB döretmek we synag maglumatlary bilen doldurmak üçin SQL skriptleri, şeýle hem düşündiriş kartasy bilen Entity synpy bolar. Şeýle hem her bir şaha üçin Gibernate konfigurasiýa faýly bolar. Bulut DB ýa-da daşarky DB-iň aýry-aýry taraplary bilen ünsüňizi sowmazlyk üçin taslama üçin H2 oturdylan DB ulanaryn . Baglanyşyga eýerip, tozan soruja H2 DB guruň. Her ädimimi 1 şahada suratlandyraryn, galanlary diňe esasy nokatlar. Ahyrynda jemläris. Bar. Bu , taslamamyň baş şahasyna baglanyşyk.

-Eke-täk gatnaşyk

Bu ýerde şahamça baglanyşyk .
  1. Taslamamyza H2 DB birikdirmeli. Bu ýerde DB we beýleki zatlar bilen rahat işlemek üçin Ultimate IDEA gerekdigini bellemelidiris. Eger sizde eýýäm bar bolsa, göni DB birikmesine geçiň. Maglumat bazasynyň goýmasyna giriň we skrinshotdaky ýaly ediň:

    JPA Entities and DB Relationships - 2

    Soň bolsa DB sazlamalaryna geçýäris. Maglumatlaryňyzy, hatda DBMS-i girizip bilersiňiz; gaýtalaýaryn, ýönekeýlik üçin H2 DB ulanýaryn.

    JPA Entities and DB Relationships - 3

    Soň bolsa, zynjyry guralyň. Bu ädim islege bagly, ýöne DB-de birnäçe shemaňyz bar bolsa maslahat berilýär.

    JPA Entities and DB Relationships - 4

    Sazlamalary ulanyň we ahyrynda şuňa meňzeş bir zat almaly:

    JPA Entities and DB Relationships - 5
  2. Maglumatlar bazasyny döretdik we oňa girişi IDEA-dan düzdük. Indi içindäki tablisalary döretmeli we käbir maglumatlar bilen doldurmaly. Mysal üçin, iki guramany alaryn: Awtor we Kitap. Kitabyň awtory bolup biler, birnäçe awtory bolup biler ýa-da ýok bolmagy mümkin. Bu mysalda ähli görnüşli baglanyşyklary dörederis. Thisöne bu pursatda - -eke-täk gatnaşyk. DB tablisalaryny döredýän degişli skript döredeliň :

    DROP TABLE IF EXISTS PUBLIC.BOOK;
    
    CREATE TABLE PUBLIC.BOOK (
      ID         INTEGER      NOT NULL AUTO_INCREMENT,
      NAME       VARCHAR(255) NOT NULL,
      PRINT_YEAR INTEGER(4)   NOT NULL,
      CONSTRAINT BOOK_PRIMARY_KEY PRIMARY KEY (ID)
    );
    
    DROP TABLE IF EXISTS PUBLIC.AUTHOR;
    
    CREATE TABLE PUBLIC.AUTHOR (
      ID          INTEGER      NOT NULL AUTO_INCREMENT,
      FIRST_NAME  VARCHAR(255) NOT NULL,
      SECOND_NAME VARCHAR(255) NOT NULL,
      BOOK_ID     INTEGER      NOT NULL UNIQUE,
      CONSTRAINT AUTHOR_PRIMARY_KEY PRIMARY KEY (ID),
      CONSTRAINT BOOK_FOREIGN_KEY FOREIGN KEY (BOOK_ID) REFERENCES BOOK (ID)
    );

    Geliň, ýerine ýetireliň:

    JPA Entities and DB Relationships - 6

    Konsolda ýerine ýetiriş netijesi:

    JPA Entities and DB Relationships - 7

    DB-de netije:

    JPA Entities and DB Relationships - 8
  3. Geliň, tablisalarymyzyň diagrammasyna seredeliň. Munuň üçin DB-de RMB:

    JPA Entities and DB Relationships - 9

    Netije:

    JPA Entities and DB Relationships - 10

    UML diagrammasynda ähli esasy düwmeleri we daşary ýurt düwmelerini görüp bileris, tablisalarymyzyň arasyndaky baglanyşygy hem görýäris.

  4. DB-ni synag maglumatlary bilen doldurýan skript ýazalyň :

    INSERT INTO PUBLIC.BOOK (NAME, PRINT_YEAR)
    VALUES ('First book', 2010),
           ('Second book', 2011),
           ('Third book', 2012);
    
    INSERT INTO PUBLIC.AUTHOR (FIRST_NAME, SECOND_NAME, BOOK_ID)
    VALUES ('Pablo', 'Lambado', 1),
           ('Pazo', 'Zopa', 2),
           ('Lika', 'Vika', 3);

    Diýjek bolýanym näme bolýar? Bir tablisanyň birligi başga bir birlik bilen baglanyşykly bolsa (ýa-da BOOK_ID-den NULL aýrylmasa düýbünden baglanyşykly däl) birek-birege gatnaşyk gerek. Mysal üçin, bir kitabyň bir awtory bolmaly. Başga ýol ýok.

  5. Indi iň gyzykly zat, Java synpyny DB guramalary bilen nädip birikdirmeli? Örän ýönekeý. Geliň, “Kitap we awtor” atly iki synp döredeliň. Mysal ulanyp, 1-nji synpy we esasy aragatnaşyk meýdanlaryny seljererin. Mysal hökmünde Awtor synpyny alalyň :

    @Data
    @Entity
    @DynamicInsert
    @DynamicUpdate
    @Table(name = "AUTHOR")
    public class Author {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "ID", nullable = false)
        private Long id;
    
        @Column(name = "FIRST_NAME", nullable = false)
        private String firstName;
    
        @Column(name = "SECOND_NAME", nullable = false)
        private String secondName;
    
        @OneToOne
        @JoinColumn(name = "BOOK_ID", unique = true, nullable = false)
        private Book book;
    }
Geliň, tertipde kesgitläliň:
  1. Synpdaky ähli meýdanlar DB guramasynyň häsiýetlerini gaýtalaýar.
  2. @Data (Lombokdan ) her bir meýdan üçin alyjy we kesgitleýjiniň dörediljekdigini, deň boljakdygyny, hashkodyň ýok ediljekdigini we toString usulynyň dörediljekdigini aýdýar.
  3. @Entity , berlen synpyň bir subýektdigini we DB guramasy bilen baglanyşyklydygyny aýdýar.
  4. @DynamicInsert we @DynamicUpdate, dinamiki goýmalar we täzelenmeler DB-de ýerine ýetiriljekdigini aýdýarlar. Bular has çuňňur Gibernate sazlamalary bolup, size CORRECT ýygyndysy bolar ýaly peýdaly bolar.
  5. @Table (name = "AUTHOR") Kitap synpyny DB AUTHOR tablisasyna baglaýar.
  6. @Id bu ugur esasy açar diýýär.
  7. @GeneratedValue (strategiýa = GenerationType.IDENTITY) - esasy açar strategiýasy.
  8. @Column (name = "ID", nullable = false) bir meýdany DB atributy bilen baglanyşdyrýar we berlen DB meýdançasynyň güýjüni ýitirip bilmejekdigini aýdýar. Bu guramalardan tablisalar döredilende hem peýdalydyr. Taslamamyzy nädip döredýändigimiziň ters prosesi, bu birlik synaglary üçin DB-lerde zerur.
  9. @OneToOne berlen meýdanyň ýeke-täk gatnaşyk meýdanydygyny aýdýar.
  10. @JoinColumn (ady = "BOOK_ID", üýtgeşik = dogry, nullable = ýalan) - üýtgeşik we güýji ýok BOOK_ID sütüni dörediler.
Ters tarapynda ( Kitap synpynda ) ýeke-ýeke baglanyşyk gurmaly we kartalaşdyryş meýdançasyny görkezmeli. @OneToOne (mappedBy = "kitap") - bu mysalda, Awtor synpynyň kitap meýdançasy. JPA olary özi baglanyşdyrar. Bir seretseň, düşündirişleriň bulaşyklygy bar ýaly bolup biler, ýöne aslynda bu örän amatly we tejribe bilen pikir etmän awtomatiki usulda goşarsyňyz.
  1. Indi Gibernate düzeliň. Munuň üçin gibernate.cfg.xml faýly dörediň:

    <?xml version='1.0' encoding='utf-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD//EN"
            "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    
    <hibernate-configuration>
        <session-factory>
            <property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>
            <property name="hibernate.connection.driver_class">org.h2.Driver</property>
    
            <property name="hibernate.connection.url">jdbc:h2:~/db/onetoone</property>
            <property name="hibernate.connection.username">root</property>
            <property name="hibernate.connection.password"/>
    
            <property name="hibernate.hbm2ddl.auto">update</property>
    
            <property name="hibernate.show_sql">true</property>
            <property name="hibernate.format_sql">true</property>
            <property name="hibernate.use_sql_comments">true</property>
    
            <property name="hibernate.generate_statistics">true</property>
    
            <property name="hibernate.jdbc.batch_size">50</property>
            <property name="hibernate.jdbc.fetch_size">50</property>
    
            <property name="hibernate.order_inserts">true</property>
            <property name="hibernate.order_updates">true</property>
            <property name="hibernate.jdbc.batch_versioned_data">true</property>
    
            <mapping class="com.qthegamep.forjavarushpublication2.entity.Book"/>
            <mapping class="com.qthegamep.forjavarushpublication2.entity.Author"/>
        </session-factory>
    </hibernate-configuration>
Sypatlaryň beýany :
  1. gibernate.dialect - saýlan DBMS-iň şiwesi.
  2. gibernate.connection.driver_class - DB-iň sürüjisi synpy.
  3. gibernate.connection.url - DB-iň utl. DB-ni düzen ilkinji nokadymyzdan alyp bilersiňiz.
  4. gibernate.connection.username - DB ulanyjy ady.
  5. gibernate.connection.password - DB ulanyjy paroly.
  6. gibernate.hbm2ddl.auto - stol ýasamak. Täzelenýän bolsa, onda eýýäm döredilen bolsa döredilmeýär, diňe täzelenýär.
  7. gibernate.show_sql - DB talaplaryny görkezmelimi.
  8. gibernate.format_sql - DB talaplaryny formatlamalymy. Notok bolsa, hemmesi bir setirde bolar. Ony açmagy maslahat berýärin.
  9. gibernate.use_sql_comments - DB talaplary. Bu Goýmak bolsa, haýyşyň Goýmak görnüşindedigi baradaky haýyşdan ýokarda teswir ýazylýar.
  10. gibernate.generate_statistika - surnallar döredýär. Has köp hasaba almagy maslahat berýärin we maslahat berýärin. Surnallary okamak, ORM bilen dogry işlemek mümkinçiligiňizi artdyrar.
  11. gibernate.jdbc.batch_size - Iň köp partiýa ululygy.
  12. gibernate.jdbc.fetch_size - Getirmegiň iň uly ululygy.
  13. gibernate.order_inserts - dinamiki goýmaga mümkinçilik berýär.
  14. gibernate.order_updates - Dinamiki täzelenmelere rugsat berýär.
  15. gibernate.jdbc.batch_versioned_data - batlamaga mümkinçilik berýär. DBMS-ä serediň: muny hemmeler goldamaýar.
  16. kartalaşdyrmak synpy - biziň guramalarymyz. Hemme zat sanawda bolmaly.
  1. Indi biziň düýp manymyz kesgitlenmeli. Muny tutanýerlilik goýmasynda barlap bileris:

    JPA Entities and DB Relationships - 11

    Netije:

    JPA Entities and DB Relationships - 12
  2. Şeýle hem, berlen maglumatlary sazlamalydyrys:

    JPA Entities and DB Relationships - 13 JPA Entities and DB Relationships - 14

    Netijeler: -eke-täk kartalaşdyrdyk. Material diňe maglumat maksatly, jikme-jiklikler salgylanmalarda.

-Eke-täk gatnaşyk

Bu ýerde şahamça baglanyşyk . Indi kody makalada goýmaýaryn, sebäbi eýýäm gaty uzyn. GitHub-daky ähli kodlara seredýäris.
  1. Başlangyç skriptini ýerine ýetirmegiň netijesinde aşakdakylary alýarys:

    JPA Entities and DB Relationships - 15

    Öňki tablisa bilen tapawudy duýýarsyňyzmy?

  2. Diagramma:

    JPA Entities and DB Relationships - 16

    Toeke-täk gatnaşyk - bir ýazyjynyň birnäçe kitaby bolup biler. Çep bir ýa-da birnäçe sag tarapa gabat gelýär.

  3. Kartalaşdyrmagyň tapawudy düşündirişlerde we meýdanlarda bolar:

    Awtor synpynda bir meýdan peýda bolýar :

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "author")
    private Set<Book> books;

    Birnäçe kitap bolup bilýändigi sebäpli, eýýäm düzüldi. @OneToMany garaýyş görnüşi barada gürleşýär. FetchType.Lazy, haýyşda görkezilmedik bolsa, kitaplaryň tutuş sanawyny ýüklemeli däldigimizi aýdýar. Şeýle hem bu meýdanString-e goşup bolmaýandygyny aýtmaly däl, ýogsam StackOverflowError çilim çekip başlarys. Söýgüli Lombok muňa alada edýär:

    @ToString(exclude = "books")

    Kitap synpynda köp-ýeke pikir alyşýarys:

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "AUTHOR_ID", nullable = false)
    private Author author;

    Bu ýerde “Birden köp” köp adamyň aýna şekili we tersine diýen netijä gelýäris. Gibernate-iň iki taraplaýyn aragatnaşyk hakda hiç zat bilmeýändigini bellemek gerek. Onuň üçin bu iki dürli baglanyşyk: biri bir tarapa, beýlekisi ters tarapa.

  4. Gibernate.cfg.xml -de kän zat üýtgemedi .

  5. Tutanýerlilik:

    JPA Entities and DB Relationships - 17

Köp adam bilen gatnaşyk

Köp adamdan biri-birine aýna şekili bolansoň, tapawutlar az bolar. Bu ýerde şahamça baglanyşyk .
  1. Başlangyç skriptini ýerine ýetirmek netijesinde aşakdaky netijäni alýarys:

    JPA Entities and DB Relationships - 18
  2. Diagramma:

    JPA Entities and DB Relationships - 19
  3. Kartalaşdyrmagyň tapawudy düşündirişlerde we meýdanlarda bolar:

    Kitap synpyna geçensoň, Awtor synpynda indi toplum ýok .

  4. gibernate.cfg.xml

  5. Tutanýerlilik:

    JPA Entities and DB Relationships - 20

Köp-köp gatnaşyk

Iň gyzykly gatnaşyklara geçeliň. Bu gatnaşyk, edepliligiň we edepsizligiň ähli düzgünlerine laýyklykda goşmaça tablisanyň üsti bilen döredilýär. Emma bu tablisa bir zat däl. Gyzykly, şeýlemi? Geliň, bu bokuna göz aýlalyň. Bu ýerde şahamça baglanyşyk .
  1. Başlangyç skriptine serediň , bu ýerde goşmaça HAS tablisasy peýda bolýar. Authorazyjy-kitap ýaly bir zat alýarys.

    Scriptazuwyň ýerine ýetirilmegi netijesinde aşakdaky tablisalary alarys:

    JPA Entities and DB Relationships - 21
  2. Diagramma:

    JPA Entities and DB Relationships - 22

    Mysal üçin, bir kitabyň köp ýazyjysy we awtoryň köp kitap bolup biljekdigi ýüze çykýar. Gabat gelmegi mümkin.

  3. Kartalaşdyrmak sapaklary sapaklaryň içinde toplumlar bolar. Iöne aýdyşym ýaly, HAS tablisasy bir zat däl.

    Awtor synpy :

    @ManyToMany
    @JoinTable(name = "HAS",
            joinColumns = @JoinColumn(name = "AUTHOR_ID", referencedColumnName = "ID"),
            inverseJoinColumns = @JoinColumn(name = "BOOK_ID", referencedColumnName = "ID")
    )
    private Set<Book> books;

    @ManyToMany gatnaşyklaryň bir görnüşidir.

    @JoinTable - atributy goşmaça HAS tablisasy bilen baglanyşdyrjak zat. Onda iki guramanyň esasy açarlaryny görkezjek iki häsiýeti kesgitleýäris.

    Kitap synpy :

    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "books")
    private Set<Author> authors;

    Bu ýerde FetchType we karta etmek üçin ulanjak meýdanymyzy görkezýäris.

  4. Gibernate.cfg.xml ýene-de üýtgemedi (her şaha üçin täze DB döredendigimizi göz öňünde tutmaýaryn) .

  5. Tutanýerlilik:

    JPA Entities and DB Relationships - 23

Debriefing

Şeýlelik bilen, DB gatnaşyklarynyň görnüşlerini ýüzleý gözden geçirdik we olary ORM modelinde nädip durmuşa geçirmelidigini bildik. Allhli baglanyşyklary görkezýän synag taslamasyny ýazdyk we gibernate / jpa-ny nädip sazlamalydygyny kesgitledik. Phew.

peýdaly baglanyşyklar

Öňki makalalarym: PS Tekstde ýalňyşlyklar we kemçilikler bolup biler. PPS Awtor bu makalany ýazanda geň bir zat çilim çekýärdi. Üns bereniňiz üçin sag boluň!
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION