Ташкилотҳои JPA && Муносибатҳои DB
Рӯзи хуб, ҳамкорон!Entity чист?
Объект an objectи ҳаёти воқеӣ аст (масалан, мошин), ки дорои атрибутҳо (дарҳо, ЧАРХҲО , муҳаррик). Объекти DB: Дар ин ҳолат, an objectи мо дар МД нигоҳ дошта мешавад, ҳама чиз оддӣ аст. Чаро ва чӣ гуна мо мошинро ба базаи маълумот дохил мекунем - мо онро баъдтар дида мебароем.Муносибатҳои DB чист?
Дере нагузашта, дар салтанати дурдаст , МД-и релятсионӣ таъсис дода шуда буд . Дар ин МБ маълумотҳо дар шакли ҷадвалҳо оварда шудаанд. Аммо ба хари аз Шрек низ маълум буд , ки механизми ба ҳам пайваст кардани ин ҷадвалҳоро эҷод кардан лозим аст. Дар натиҷа, 4 муносибатҳои DB пайдо шуданд : Агар шумо бори аввал ин ҳамаро мебинед, ман шуморо бори дигар огоҳ мекунам - бадтар мешавад: дар бораи сайру гашт фикр кунед. Мо ҳамаи ин муносибатҳоро бо истифода аз як мисол таҳлил мекунем ва фарқияти байни онҳоро мефаҳмем.Намунаи даҳшат
Мо як лоиҳа дорем, ки дорои 5 шоха хоҳад буд: усто, ки дар он тавсифи лоиҳа ва 1 фorал барои ҳар як робитаи МД мавҷуд аст. Ҳар як фorал дорои скриптҳои SQL барои эҷоди МД ва пур кардани он бо маълумоти санҷишӣ, инчунин синфи Entity бо харитасозии эзоҳҳо мебошад. Инчунин барои ҳар як фorал файли танзимоти Hibernate мавҷуд аст. Ман DB-и дохorи H2-ро барои лоиҳа истифода хоҳам кард, то аз ҷанбаҳои инфиродии абрии DB ё DB берунӣ парешон нашаванд. Бо пайравӣ аз истинод, H2 DB-ро дар чангкашакатон насб кунед. Ман ҳар як қадамро дар 1 фorал тавсиф мекунам, боқимонда танҳо нуктаҳои асосӣ мебошанд. Дар охир мо ҷамъбаст мекунем. Бирав. Ин пайванд ба фorали асосии лоиҳаи ман аст.Муносибати як ба як
Истинод ба фorал дар ин ҷо .-
Мо бояд H2 DB-ро ба лоиҳаи худ пайваст кунем. Дар ин ҷо мо бояд таъкид кунем, ки ба мо Ultimate IDEA лозим аст, то бо DB ва чизҳои дигар бароҳат кор кунад. Агар шумо аллакай онро дошта бошед, пас мустақиман ба пайвасти DB гузаред. Ба ҷадвали пойгоҳи додаҳо равед ва тавре ки дар скриншот нишон дода шудааст, иҷро кунед:
Минбаъд мо ба танзимоти DB мегузарем. Шумо метавонед маълумоти худ ва ҳатто DBMS-и худро ворид кунед; Ман такрор мекунам, ман H2 DB-ро барои содда истифода мебарам.
Баъд, биёед схемаро танзим кунем. Ин қадам ихтиёрист, аммо тавсия дода мешавад, агар шумо дар МД якчанд схема дошта бошед.
Танзимотҳоро татбиқ кунед ва дар ниҳоят мо бояд чунин чизе ба даст орем:
-
Мо пойгоҳи додаҳоро таъсис додем ва дастрасӣ ба он аз 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) );
Ва биёед онро иҷро кунем:
Натиҷаи иҷро дар консол:
Натиҷа дар DB:
-
Биёед ба диаграммаи ҷадвалҳои худ назар андозем. Барои ин, RMB дар DB мо:
Натиҷа:
Дар диаграммаи UML мо метавонем ҳамаи калидҳои ибтидоӣ ва калидҳои хориҷиро бинем, мо инчунин алоқаи байни ҷадвалҳои худро мебинем.
-
Биёед скрипт нависем, ки 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 хориҷ карда шавад). Дар мисоли мо, як китоб БОЯД як муаллиф дошта бошад. Дигар роҳ нест.
-
Ҳоло чизи ҷолибтарин ин аст, ки чӣ гуна синфи 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; }
- Ҳама майдонҳои синф атрибутҳои an objectи МД-ро такрор мекунанд.
- @Data (аз Lombok ) мегӯяд, ки барои ҳар як майдон як қабулкунанда ва танзимкунанда эҷод карда мешавад, баробар аст, codeи hashcode бекор карда мешавад ва усули toString тавлид мешавад.
- @Entity мегӯяд, ки синфи додашуда an object аст ва бо an objectи DB алоқаманд аст.
- @DynamicInsert ва @DynamicUpdate мегӯянд, ки дохилкуниҳо ва навсозиҳои динамикӣ дар МД анҷом дода мешаванд. Инҳо танзимоти амиқтари Hibernate мебошанд, ки барои шумо муфид хоҳанд буд, то шумо маҷмӯи ДУРУСТ дошта бошед.
- @Table (ном = "AUTHOR") синфи Китобро ба ҷадвали DB AUTHOR мепайвандад.
- @Id мегӯяд, ки ин майдон калиди асосӣ аст.
- @GeneratedValue (стратегия = GenerationType.IDENTITY) – стратегияи асосии тавлиди калид.
- @Column (ном = "ID", nullable = false) майдонро бо атрибути МД алоқаманд мекунад ва инчунин мегӯяд, ки майдони МД-и додашуда сифр буда наметавонад. Ин инчунин ҳангоми тавлиди ҷадвалҳо аз an objectҳо муфид аст. Раванди баръакс ба он, ки чӣ гуна мо ҳоло лоиҳаи худро эҷод мекунем, ин дар МД-ҳои санҷишӣ барои санҷишҳои воҳид лозим аст.
- @OneToOne мегӯяд, ки майдони додашуда майдони муносибатҳои Як ба Як аст.
- @JoinColumn (ном = "BOOK_ID", нодир = ҳақиқӣ, nullable = бардурӯғ) - сутуни BOOK_ID эҷод карда мешавад, ки беназир аст ва нул нест.
-
Акнун биёед 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>
- hibernate.dialect лаҳҷаи DBMS мебошад, ки мо интихоб кардем.
- hibernate.connection.driver_class - Синфи ронандагони МД-и мо.
- hibernate.connection.url - utl аз DB мо. Шумо метавонед онро аз нуқтаи аввале, ки мо DB-ро танзим кардаем, гиред.
- hibernate.connection.username - номи корбари DB.
- hibernate.connection.password — пароли корбари МД.
- hibernate.hbm2ddl.auto - насб кардани тавлиди ҷадвал. Агар навсозӣ бошад, он гоҳ тавлид намекунад, агар он аллакай сохта шуда бошад, балки танҳо онро навсозӣ мекунад.
- hibernate.show_sql - оё барои нишон додани дархостҳои DB.
- hibernate.format_sql - оё формат кардани дархостҳои DB. Агар не, пас ҳама дар як хат хоҳанд буд. Ман тавсия медиҳам, ки онро фаъол созам.
- hibernate.use_sql_comments - шарҳҳои дархостҳои DB. Агар ин Insert бошад, пас дар болои дархост шарҳе навишта мешавад, ки дархост навъи Insert аст.
- hibernate.generate_statistics - гузоришҳоро тавлид мекунад. Ман тавсия ва тавсия медиҳам, ки сабти номро то ҳадди аксар муқаррар кунед. Хондани гузоришҳо имкони дурусти кор бо ORM-ро зиёд мекунад.
- hibernate.jdbc.batch_size — Андозаи максималии партия.
- hibernate.jdbc.fetch_size — Андозаи максималии гирифтан.
- hibernate.order_inserts - имкон медиҳад, ки воридоти динамикӣ.
- hibernate.order_updates - Иҷозат медиҳад, ки навсозиҳои динамикӣ.
- hibernate.jdbc.batch_versioned_data - имкон медиҳад batching. Ба DBMS-и худ нигаред: на ҳама инро дастгирӣ мекунанд.
- синфи харитасозӣ - синфҳое, ки an objectҳои мо мебошанд. Ҳама чизро номбар кардан лозим аст.
-
Акнун мохияти мо бояд муайян карда шавад. Мо метавонем инро дар ҷадвали устуворӣ тафтиш кунем:
Натиҷа:
-
Мо инчунин бояд маълумотро таъин кунем:
Натиҷаҳо: Мо харитасозии як ба якро анҷом додем. Мавод танҳо барои мақсадҳои иттилоотӣ аст, тафсилот дар истинодҳо оварда шудаанд.
Муносибати як ба бисёр
Истинод ба фorал дар ин ҷо . Ман дигар codeро дар мақола ҷойгир намекунам, зеро он аллакай хеле дароз аст. Мо ҳама codeҳоро дар GitHub мебинем.-
Дар натиҷаи иҷрои скрипти оғозёбӣ, мо инҳоро мегирем:
Оё шумо фарқиятро бо ҷадвали қаблӣ эҳсос мекунед?
-
Диаграмма:
Муносибати як ба бисёр - як муаллиф метавонад якчанд китоб дошта бошад. Объекти чап ба як ё якчанд рости рост мувофиқат мекунад.
-
Тафовут дар харитасозӣ дар шарҳҳо ва майдонҳо хоҳад буд:
Дар синфи Муаллиф майдон пайдо мешавад :
@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 дар бораи алоқаи дуҷониба чизе намедонад. Барои у ин ду робитаи гуногунанд: яке ба як самт, дигаре ба самти муқобил.
-
Дар hibernate.cfg.xml ҳеҷ чизи зиёд тағйир наёфтааст .
-
Устуворӣ:
Муносибати бисёр ба як
Азбаски бисёриҳо ба як тасвири оинаи Як-ба-Бисёранд, фарқиятҳо кам хоҳанд буд. Истинод ба фorал дар ин ҷо .-
Дар натиҷаи иҷрои скрипти оғозёбӣ, мо натиҷаи зеринро мегирем:
-
Диаграмма:
-
Тафовут дар харитасозӣ дар шарҳҳо ва майдонҳо хоҳад буд:
Дар синфи Муаллиф дигар маҷмӯа мавҷуд нест, зеро он ба синфи Китоб гузаштааст .
-
Устуворӣ:
Муносибати бисёр ба бисёр
Биёед ба муносибатҳои ҷолибтарин гузарем. Ин муносибат мувофики тамоми коидахои одоб ва зишт ба воситаи чадвали иловагй ба вучуд оварда мешавад. Аммо ин ҷадвал як an object нест. Ҷолиб, дуруст? Биёед ба ин ғазаб назар андозем. Истинод ба фorал дар ин ҷо .-
Ба скрипти оғозёбӣ нигаред , дар ин ҷо ҷадвали иловагии HAS пайдо мешавад. Мо чизе ба монанди муаллиф-доро-китоб мегирем.
Дар натиҷаи иҷрои скрипт, мо ҷадвалҳои зеринро мегирем:
-
Диаграмма:
Дар мисоли мо маълум мешавад, ки як китоб метавонад муаллифони зиёд дошта бошад ва муаллиф метавонад китобҳои зиёде дошта бошад. Онҳо метавонанд такрор шаванд.
-
Синфҳои харитасозӣ дар дох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 ва майдонеро, ки барои харита истифода хоҳем кард, нишон медиҳем.
-
hibernate.cfg.xml- и мо боз бетағйир монд (ман он фактро ба назар намегирам, ки мо барои ҳар як фorал як МД-и нав эҷод кардем).
-
Устуворӣ:
Брифинг
Ҳамин тавр, мо намудҳои муносибатҳои DB-ро ба таври рӯякӣ тафтиш кардем ва фаҳмидем, ки чӣ гуна онҳоро дар модели ORM татбиқ кардан мумкин аст. Мо як лоиҳаи санҷиширо навиштем, ки ҳама пайвастҳоро нишон медиҳад ва фаҳмидем, ки чӣ тавр hibernate / jpa танзим карда шавад. Фу.истинодҳои муфид
- Дар асл худи лоиҳа
- Фorали як ба як
- Як-ба-Бисёр фorал
- Фorали бисёр ба як
- Фorали бисёр ба бисёр
- Онро хонед
- Ва хонед
GO TO FULL VERSION