JavaRush /Блоги Java /Random-TG /Ташкилотҳои JPA ва муносибатҳои DB
Nikita Koliadin
Сатҳи
Днепр

Ташкилотҳои JPA ва муносибатҳои DB

Дар гурӯҳ нашр шудааст

Ташкилотҳои JPA && Муносибатҳои DB

Рӯзи хуб, ҳамкорон!
Муассисаҳои JPA ва муносибатҳои DB - 1
Ин мавод барои онҳое пешбинӣ шудааст, ки аллакай дар бораи ташкor пойгоҳи додаҳо (минбаъд танҳо DB - "Махзани маълумот"), дониши ҳадди ақал дар бораи чӣ гуна кор кардани Харитасозии Объект-Реляциявӣ (минбаъд танҳо ORM ) ва татбиқи он, ба монанди Hibernate / JPA доранд. . Агар шумо бо ин шинос набошед, ман ба шумо маслиҳат медиҳам, ки бо JDBC оғоз кунед ва танҳо баъд ба модели ORM гузаред. Ман шуморо ҳушдор додам ва пас аз хондани ин мақола бидуни омодагии дуруст ман барои рӯҳияи шумо масъул нестам! :) Биёед ҳама чизро бо тартиб сар кунем. Аввалан, мо каме ба назария омӯзем, танҳо каме. Дуюм, мо мефаҳмем, ки чӣ гуна ин корро дар Java дӯстдоштаи ҳама иҷро кунем. Мо инчунин бо шумо варақаи фиреби лоиҳа менависем, ки фаҳмиши моро дар бораи мавзӯъ мустаҳкам мекунад ва ҳамчун қолаб барои чӣ гуна бояд харитасозӣ карда шавад . Пас, биёед ин корро кунем!

Entity чист?

Объект an objectи ҳаёти воқеӣ аст (масалан, мошин), ки дорои атрибутҳо (дарҳо, ЧАРХҲО , муҳаррик). Объекти DB: Дар ин ҳолат, an objectи мо дар МД нигоҳ дошта мешавад, ҳама чиз оддӣ аст. Чаро ва чӣ гуна мо мошинро ба базаи маълумот дохил мекунем - мо онро баъдтар дида мебароем.

Муносибатҳои DB чист?

Дере нагузашта, дар салтанати дурдаст , МД-и релятсионӣ таъсис дода шуда буд . Дар ин МБ маълумотҳо дар шакли ҷадвалҳо оварда шудаанд. Аммо ба хари аз Шрек низ маълум буд , ки механизми ба ҳам пайваст кардани ин ҷадвалҳоро эҷод кардан лозим аст. Дар натиҷа, 4 муносибатҳои DB пайдо шуданд :
  1. Як ба як
  2. Як-ба-Бисёр
  3. Бисёр ба як
  4. Бисёр-ба-Бисёр
Агар шумо бори аввал ин ҳамаро мебинед, ман шуморо бори дигар огоҳ мекунам - бадтар мешавад: дар бораи сайру гашт фикр кунед. Мо ҳамаи ин муносибатҳоро бо истифода аз як мисол таҳлил мекунем ва фарқияти байни онҳоро мефаҳмем.

Намунаи даҳшат

Мо як лоиҳа дорем, ки дорои 5 шоха хоҳад буд: усто, ки дар он тавсифи лоиҳа ва 1 фorал барои ҳар як робитаи МД мавҷуд аст. Ҳар як фorал дорои скриптҳои SQL барои эҷоди МД ва пур кардани он бо маълумоти санҷишӣ, инчунин синфи Entity бо харитасозии эзоҳҳо мебошад. Инчунин барои ҳар як фorал файли танзимоти Hibernate мавҷуд аст. Ман DB-и дохorи H2-ро барои лоиҳа истифода хоҳам кард, то аз ҷанбаҳои инфиродии абрии DB ё DB берунӣ парешон нашаванд. Бо пайравӣ аз истинод, H2 DB-ро дар чангкашакатон насб кунед. Ман ҳар як қадамро дар 1 фorал тавсиф мекунам, боқимонда танҳо нуктаҳои асосӣ мебошанд. Дар охир мо ҷамъбаст мекунем. Бирав. Ин пайванд ба фorали асосии лоиҳаи ман аст.

Муносибати як ба як

Истинод ба фorал дар ин ҷо .
  1. Мо бояд H2 DB-ро ба лоиҳаи худ пайваст кунем. Дар ин ҷо мо бояд таъкид кунем, ки ба мо Ultimate IDEA лозим аст, то бо DB ва чизҳои дигар бароҳат кор кунад. Агар шумо аллакай онро дошта бошед, пас мустақиман ба пайвасти DB гузаред. Ба ҷадвали пойгоҳи додаҳо равед ва тавре ки дар скриншот нишон дода шудааст, иҷро кунед:

    Муассисаҳои JPA ва муносибатҳои DB - 2

    Минбаъд мо ба танзимоти DB мегузарем. Шумо метавонед маълумоти худ ва ҳатто DBMS-и худро ворид кунед; Ман такрор мекунам, ман H2 DB-ро барои содда истифода мебарам.

    Муассисаҳои JPA ва муносибатҳои DB - 3

    Баъд, биёед схемаро танзим кунем. Ин қадам ихтиёрист, аммо тавсия дода мешавад, агар шумо дар МД якчанд схема дошта бошед.

    Муассисаҳои JPA ва муносибатҳои DB - 4

    Танзимотҳоро татбиқ кунед ва дар ниҳоят мо бояд чунин чизе ба даст орем:

    Муассисаҳои JPA ва муносибатҳои DB - 5
  2. Мо пойгоҳи додаҳоро таъсис додем ва дастрасӣ ба он аз IDEA танзим кардем. Акнун шумо бояд дар он ҷадвалҳо эҷод кунед ва онро бо баъзе маълумот пур кунед. Масалан, ман ду an objectро мегирам: Муаллиф ва Китоб. Китоб метавонад муаллиф дошта бошад, муаллифи сершумор дошта бошад ё як нафар набошад. Дар ин мисол мо ҳама намуди пайвастҳоро эҷод мекунем. Аммо дар ин лаҳза - Муносибати Як ба Як. Биёед скрипти мувофиқеро созем, ки Ҷадвалҳои DB -ро эҷод мекунад :

    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)
    );

    Ва биёед онро иҷро кунем:

    Муассисаҳои JPA ва муносибатҳои DB - 6

    Натиҷаи иҷро дар консол:

    Муассисаҳои JPA ва муносибатҳои DB - 7

    Натиҷа дар DB:

    Муассисаҳои JPA ва муносибатҳои DB - 8
  3. Биёед ба диаграммаи ҷадвалҳои худ назар андозем. Барои ин, RMB дар DB мо:

    Муассисаҳои JPA ва муносибатҳои DB - 9

    Натиҷа:

    Муассисаҳои JPA ва муносибатҳои DB - 10

    Дар диаграммаи UML мо метавонем ҳамаи калидҳои ибтидоӣ ва калидҳои хориҷиро бинем, мо инчунин алоқаи байни ҷадвалҳои худро мебинем.

  4. Биёед скрипт нависем, ки DB-и моро бо маълумоти санҷиш пур кунад:

    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);

    Дар назар дорам, чӣ мешавад? Муносибати як ба як вақте лозим аст, ки воҳиди як ҷадвал бо як ҷузъи дигари ҷадвал алоқаманд бошад (ё умуман алоқаманд набошад, агар NOT NULL аз BOOK_ID хориҷ карда шавад). Дар мисоли мо, як китоб БОЯД як муаллиф дошта бошад. Дигар роҳ нест.

  5. Ҳоло чизи ҷолибтарин ин аст, ки чӣ гуна синфи Java-ро бо an objectҳои DB пайваст кардан мумкин аст? Хеле содда. Биёед ду синфи Китоб ва Муаллиф эҷод кунем. Бо истифода аз мисол, ман синфи 1 ва соҳаҳои асосии коммуникатсияро таҳлил мекунам. Биёед синфи Муаллифро мисол гирем :

    @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;
    }
Биёед онро бо тартиб муайян кунем:
  1. Ҳама майдонҳои синф атрибутҳои an objectи МД-ро такрор мекунанд.
  2. @Data (аз Lombok ) мегӯяд, ки барои ҳар як майдон як қабулкунанда ва танзимкунанда эҷод карда мешавад, баробар аст, codeи hashcode бекор карда мешавад ва усули toString тавлид мешавад.
  3. @Entity мегӯяд, ки синфи додашуда an object аст ва бо an objectи DB алоқаманд аст.
  4. @DynamicInsert ва @DynamicUpdate мегӯянд, ки дохилкуниҳо ва навсозиҳои динамикӣ дар МД анҷом дода мешаванд. Инҳо танзимоти амиқтари Hibernate мебошанд, ки барои шумо муфид хоҳанд буд, то шумо маҷмӯи ДУРУСТ дошта бошед.
  5. @Table (ном = "AUTHOR") синфи Китобро ба ҷадвали DB AUTHOR мепайвандад.
  6. @Id мегӯяд, ки ин майдон калиди асосӣ аст.
  7. @GeneratedValue (стратегия = GenerationType.IDENTITY) – стратегияи асосии тавлиди калид.
  8. @Column (ном = "ID", nullable = false) майдонро бо атрибути МД алоқаманд мекунад ва инчунин мегӯяд, ки майдони МД-и додашуда сифр буда наметавонад. Ин инчунин ҳангоми тавлиди ҷадвалҳо аз an objectҳо муфид аст. Раванди баръакс ба он, ки чӣ гуна мо ҳоло лоиҳаи худро эҷод мекунем, ин дар МД-ҳои санҷишӣ барои санҷишҳои воҳид лозим аст.
  9. @OneToOne мегӯяд, ки майдони додашуда майдони муносибатҳои Як ба Як аст.
  10. @JoinColumn (ном = "BOOK_ID", нодир = ҳақиқӣ, nullable = бардурӯғ) - сутуни BOOK_ID эҷод карда мешавад, ки беназир аст ва нул нест.
Дар тарафи қафо (дар синфи Китоб ), мо инчунин бояд пайвасти Як ба як созем ва майдонеро, ки дар он харитасозӣ рух медиҳад, нишон диҳем. @OneToOne(mappedBy = "book") - дар ин мисол, ин майдони китоби синфи Муаллиф аст. JPA худашон онҳоро пайваст мекунад. Дар назари аввал чунин ба назар мерасад, ки эзоҳҳо бесарусомонӣ вуҷуд доранд, аммо дар асл он хеле қулай аст ва бо таҷриба шумо онҳоро ҳатто фикр накарда ба таври худкор илова мекунед.
  1. Акнун биёед Hibernate-ро танзим кунем. Барои ин, файли hibernate.cfg.xml эҷод кунед :

    <?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>
Тавсифи хосиятҳо :
  1. hibernate.dialect лаҳҷаи DBMS мебошад, ки мо интихоб кардем.
  2. hibernate.connection.driver_class - Синфи ронандагони МД-и мо.
  3. hibernate.connection.url - utl аз DB мо. Шумо метавонед онро аз нуқтаи аввале, ки мо DB-ро танзим кардаем, гиред.
  4. hibernate.connection.username - номи корбари DB.
  5. hibernate.connection.password — пароли корбари МД.
  6. hibernate.hbm2ddl.auto - насб кардани тавлиди ҷадвал. Агар навсозӣ бошад, он гоҳ тавлид намекунад, агар он аллакай сохта шуда бошад, балки танҳо онро навсозӣ мекунад.
  7. hibernate.show_sql - оё барои нишон додани дархостҳои DB.
  8. hibernate.format_sql - оё формат кардани дархостҳои DB. Агар не, пас ҳама дар як хат хоҳанд буд. Ман тавсия медиҳам, ки онро фаъол созам.
  9. hibernate.use_sql_comments - шарҳҳои дархостҳои DB. Агар ин Insert бошад, пас дар болои дархост шарҳе навишта мешавад, ки дархост навъи Insert аст.
  10. hibernate.generate_statistics - гузоришҳоро тавлид мекунад. Ман тавсия ва тавсия медиҳам, ки сабти номро то ҳадди аксар муқаррар кунед. Хондани гузоришҳо имкони дурусти кор бо ORM-ро зиёд мекунад.
  11. hibernate.jdbc.batch_size — Андозаи максималии партия.
  12. hibernate.jdbc.fetch_size — Андозаи максималии гирифтан.
  13. hibernate.order_inserts - имкон медиҳад, ки воридоти динамикӣ.
  14. hibernate.order_updates - Иҷозат медиҳад, ки навсозиҳои динамикӣ.
  15. hibernate.jdbc.batch_versioned_data - имкон медиҳад batching. Ба DBMS-и худ нигаред: на ҳама инро дастгирӣ мекунанд.
  16. синфи харитасозӣ - синфҳое, ки an objectҳои мо мебошанд. Ҳама чизро номбар кардан лозим аст.
  1. Акнун мохияти мо бояд муайян карда шавад. Мо метавонем инро дар ҷадвали устуворӣ тафтиш кунем:

    Муассисаҳои JPA ва муносибатҳои DB - 11

    Натиҷа:

    Муассисаҳои JPA ва муносибатҳои DB - 12
  2. Мо инчунин бояд маълумотро таъин кунем:

    Муассисаҳои JPA ва муносибатҳои DB - 13 Муассисаҳои JPA ва муносибатҳои DB - 14

    Натиҷаҳо: Мо харитасозии як ба якро анҷом додем. Мавод танҳо барои мақсадҳои иттилоотӣ аст, тафсилот дар истинодҳо оварда шудаанд.

Муносибати як ба бисёр

Истинод ба фorал дар ин ҷо . Ман дигар codeро дар мақола ҷойгир намекунам, зеро он аллакай хеле дароз аст. Мо ҳама codeҳоро дар GitHub мебинем.
  1. Дар натиҷаи иҷрои скрипти оғозёбӣ, мо инҳоро мегирем:

    Муассисаҳои JPA ва муносибатҳои DB - 15

    Оё шумо фарқиятро бо ҷадвали қаблӣ эҳсос мекунед?

  2. Диаграмма:

    Муассисаҳои JPA ва муносибатҳои DB - 16

    Муносибати як ба бисёр - як муаллиф метавонад якчанд китоб дошта бошад. Объекти чап ба як ё якчанд рости рост мувофиқат мекунад.

  3. Тафовут дар харитасозӣ дар шарҳҳо ва майдонҳо хоҳад буд:

    Дар синфи Муаллиф майдон пайдо мешавад :

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

    Ин аллакай маҷмӯа аст, зеро мо метавонем якчанд китоб дошта бошем. @OneToMany дар бораи намуди муносибат гап мезанад. FetchType.Lazy мегӯяд, ки ба мо лозим нест, ки тамоми рӯйхати китобҳоро бор кунем, агар он дар дархост зикр нашуда бошад. Инчунин бояд гуфт, ки ин майдонро ба toString илова кардан НАМЕТАВОНАД, вагарна мо тамокукашии StackOverflowError-ро оғоз мекунем. Ломбоки маҳбуби ман дар ин бора ғамхорӣ мекунад:

    @ToString(exclude = "books")

    Дар синфи китоб мо фикру мулоҳизаҳои бисёр ба як мекунем:

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

    Дар ин ҷо мо ба хулосае омадем, ки Як-ба-Бисёр тасвири оинаи бисёр-ба-Як аст ва баръакс. Бояд қайд кард, ки Hibernate дар бораи алоқаи дуҷониба чизе намедонад. Барои у ин ду робитаи гуногунанд: яке ба як самт, дигаре ба самти муқобил.

  4. Дар hibernate.cfg.xml ҳеҷ чизи зиёд тағйир наёфтааст .

  5. Устуворӣ:

    Муассисаҳои JPA ва муносибатҳои DB - 17

Муносибати бисёр ба як

Азбаски бисёриҳо ба як тасвири оинаи Як-ба-Бисёранд, фарқиятҳо кам хоҳанд буд. Истинод ба фorал дар ин ҷо .
  1. Дар натиҷаи иҷрои скрипти оғозёбӣ, мо натиҷаи зеринро мегирем:

    Муассисаҳои JPA ва муносибатҳои DB - 18
  2. Диаграмма:

    Муассисаҳои JPA ва муносибатҳои DB - 19
  3. Тафовут дар харитасозӣ дар шарҳҳо ва майдонҳо хоҳад буд:

    Дар синфи Муаллиф дигар маҷмӯа мавҷуд нест, зеро он ба синфи Китоб гузаштааст .

  4. hibernate.cfg.xml

  5. Устуворӣ:

    Муассисаҳои JPA ва муносибатҳои DB - 20

Муносибати бисёр ба бисёр

Биёед ба муносибатҳои ҷолибтарин гузарем. Ин муносибат мувофики тамоми коидахои одоб ва зишт ба воситаи чадвали иловагй ба вучуд оварда мешавад. Аммо ин ҷадвал як an object нест. Ҷолиб, дуруст? Биёед ба ин ғазаб назар андозем. Истинод ба фorал дар ин ҷо .
  1. Ба скрипти оғозёбӣ нигаред , дар ин ҷо ҷадвали иловагии HAS пайдо мешавад. Мо чизе ба монанди муаллиф-доро-китоб мегирем.

    Дар натиҷаи иҷрои скрипт, мо ҷадвалҳои зеринро мегирем:

    Муассисаҳои JPA ва муносибатҳои DB - 21
  2. Диаграмма:

    Муассисаҳои JPA ва муносибатҳои DB - 22

    Дар мисоли мо маълум мешавад, ки як китоб метавонад муаллифони зиёд дошта бошад ва муаллиф метавонад китобҳои зиёде дошта бошад. Онҳо метавонанд такрор шаванд.

  3. Синфҳои харитасозӣ дар дохor синфҳо маҷмӯаҳо хоҳанд дошт. Аммо тавре ки ман гуфтам, ҷадвали HAS як an object нест.

    Синфи муаллиф :

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

    @ManyToMany як намуди муносибат аст.

    @JoinTable - ин маҳз он чизест, ки атрибутро бо ҷадвали иловагии HAS пайваст мекунад. Дар он мо ду атрибутеро муайян мекунем, ки ба калидҳои асосии ду an object ишора мекунанд.

    Синфи китоб :

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

    Дар ин ҷо мо FetchType ва майдонеро, ки барои харита истифода хоҳем кард, нишон медиҳем.

  4. hibernate.cfg.xml- и мо боз бетағйир монд (ман он фактро ба назар намегирам, ки мо барои ҳар як фorал як МД-и нав эҷод кардем).

  5. Устуворӣ:

    Муассисаҳои JPA ва муносибатҳои DB - 23

Брифинг

Ҳамин тавр, мо намудҳои муносибатҳои DB-ро ба таври рӯякӣ тафтиш кардем ва фаҳмидем, ки чӣ гуна онҳоро дар модели ORM татбиқ кардан мумкин аст. Мо як лоиҳаи санҷиширо навиштем, ки ҳама пайвастҳоро нишон медиҳад ва фаҳмидем, ки чӣ тавр hibernate / jpa танзим карда шавад. Фу.

истинодҳои муфид

Мақолаҳои қаблии ман: PS Шояд дар матн хатоҳо ва камбудиҳо ҷой дошта бошанд. PPS Муаллиф ҳангоми навиштани ин мақола чизи аҷиберо сигор мекашид. Ба диққататон ташаккур!
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION