JavaRush /Blog Jawa /Random-JV /Entitas JPA lan Hubungan DB
Nikita Koliadin
tingkat
Днепр

Entitas JPA lan Hubungan DB

Diterbitake ing grup

Entitas JPA && Hubungan DB

Sugeng siang, kanca-kanca!
Entitas JPA lan Hubungan DB - 1
Materi iki ditujokake kanggo wong-wong sing wis duwe pangerten babagan organisasi database (sabanjuré mung DB - "Database"), kawruh minimal babagan cara Pemetaan Obyek-Relasional (sabanjuré mung ORM ), lan implementasine, kayata Hibernate / JPA . Yen sampeyan ora menowo iki, Aku maringi pitutur sampeyan miwiti karo JDBC , lan mung banjur pindhah menyang model ORM. Aku ngelingake sampeyan, lan aku ora tanggung jawab kanggo psyche sawise maca artikel iki tanpa persiapan sing tepat! :) Ayo dadi miwiti kanggo menehi hasil karo kabeh supaya. Kaping pisanan, kita bakal nliti teori kasebut, mung sethithik. Kapindho, kita bakal nemtokake cara nindakake telek iki ing basa Jawa sing disenengi saben wong. Kita uga bakal nulis karo sampeyan sheet project-cheat, sing bakal nggabungake pemahaman babagan topik kasebut lan dadi cithakan kanggo CARA pemetaan kudu ditindakake . Dadi, ayo nglakoni!

Apa Entitas?

Entitas minangka obyek saka urip nyata (contone, mobil) sing nduweni atribut (lawang, RODA , mesin). Entitas DB: Ing kasus iki, entitas kita disimpen ing DB, kabeh gampang. Napa lan carane kita sijine mobil menyang database - kita bakal katon ing mengko.

Apa Hubungan DB?

Ing jaman biyen, ing kerajaan sing adoh , DB relasional digawe . Ing DB iki, data ditampilake ing wangun tabel. Nanging malah kuldi saka Shrek mangertos sing perlu kanggo nggawe mekanisme kanggo interconnecting tabel iki. Akibaté, 4 hubungan DB katon :
  1. Siji-siji
  2. Siji-kanggo-Many
  3. Akeh-kanggo-Siji
  4. Akeh-kanggo-Many
Yen sampeyan ndeleng kabeh iki kanggo pisanan, aku ngelingake maneh - bakal dadi luwih elek: mikir babagan mlaku-mlaku. Kita bakal nganalisa kabeh hubungan kasebut nggunakake conto, lan ngerti bedane.

Tuladha Horor

Kita bakal duwe siji proyek sing bakal duwe 5 cabang: master, ing ngendi bakal ana katrangan babagan proyek kasebut, lan 1 cabang kanggo saben hubungan DB. Saben cabang bakal ngemot skrip SQL kanggo nggawe DB lan ngisi data test, plus kelas Entitas kanthi pemetaan anotasi. Ana uga file konfigurasi Hibernate kanggo saben cabang. Aku bakal nggunakake H2 embeded DB kanggo proyek supaya ora disambi dening aspèk individu saka maya DB utawa external DB. Kanthi ngetutake link kasebut, pasang H2 DB ing panyedot vakum. Aku bakal njlèntrèhaké saben langkah ing 1 cabang, liyane mung TCTerms tombol. Ing pungkasan kita bakal ngringkes. Tindak. Iki minangka link menyang cabang master proyekku.

Hubungan siji-kanggo-siji

Link menyang cabang kene .
  1. Kita kudu nyambungake H2 DB menyang proyek kita. Ing kene kita kudu nandheske yen kita butuh Ultimate IDEA supaya bisa kerja kanthi nyaman karo DB lan liya-liyane. Yen sampeyan wis duwe, banjur langsung menyang sambungan DB. Pindhah menyang tab Database lan tindakake kaya ing gambar:

    Entitas JPA lan Hubungan DB - 2

    Sabanjure kita pindhah menyang setelan DB. Sampeyan bisa ngetik data, lan malah DBMS; Aku mbaleni, aku nggunakake H2 DB kanggo gamblang.

    Entitas JPA lan Hubungan DB - 3

    Sabanjure, ayo nyiyapake sirkuit. Langkah iki opsional nanging dianjurake yen sampeyan duwe sawetara skema ing DB.

    Entitas JPA lan Hubungan DB - 4

    Aplikasi setelan, lan ing pungkasan kita kudu njaluk kaya iki:

    Entitas JPA lan Hubungan DB - 5
  2. Kita nggawe database lan ngatur akses menyang saka IDEA. Saiki sampeyan kudu nggawe tabel lan isi karo sawetara data. Contone, aku bakal njupuk rong entitas: Pengarang lan Buku. Sawijining buku bisa uga ana panulis, bisa uga ana sawetara penulis, utawa ora ana siji. Ing conto iki, kita bakal nggawe kabeh jinis sambungan. Nanging ing titik iki - sesambetan siji-kanggo-siji. Ayo nggawe skrip sing cocog sing nggawe Tabel 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)
    );

    Lan ayo nglakoni:

    Entitas JPA lan Hubungan DB - 6

    Asil eksekusi ing konsol:

    Entitas JPA lan Hubungan DB - 7

    Hasil DB:

    Entitas JPA lan Hubungan DB - 8
  3. Ayo katon ing diagram tabel kita. Kanggo nindakake iki, RMB ing DB kita:

    Entitas JPA lan Hubungan DB - 9

    asil:

    Entitas JPA lan Hubungan DB - 10

    Ing diagram UML kita bisa ndeleng kabeh tombol utami lan tombol manca, kita uga ndeleng sambungan antarane tabel kita.

  4. Ayo nulis skrip sing ngisi DB karo data tes:

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

    Maksudku, apa sing kedadeyan? Hubungan siji-kanggo-siji dibutuhake nalika entitas siji tabel ana hubungane karo entitas siji liyane (utawa ora ana hubungane yen NOT NULL dibusak saka BOOK_ID). Ing conto kita, siji buku kudu duwe siji penulis. Ora ana cara liya.

  5. Saiki sing paling menarik yaiku carane nyambungake kelas Java karo entitas DB? Prasaja banget. Ayo nggawe rong kelas Buku lan Pengarang. Nggunakake conto, aku bakal nganalisa kelas 1 lan lapangan komunikasi utama. Ayo njupuk kelas Pengarang minangka conto :

    @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;
    }
Ayo dipikirake kanthi urutan:
  1. Kabeh kolom ing kelas mbaleni atribut entitas DB.
  2. @Data (saka Lombok ) ujar manawa kanggo saben lapangan bakal digawe getter lan setter, padha karo, kode hash bakal diganti, lan metode toString bakal diasilake.
  3. @Entity ngandhakake yen kelas sing diwenehake minangka entitas lan digandhengake karo entitas DB.
  4. @DynamicInsert lan @DynamicUpdate ujar manawa sisipan lan nganyari dinamis bakal ditindakake ing DB. Iki minangka setelan Hibernate sing luwih jero sing bakal migunani kanggo sampeyan supaya sampeyan duwe batching sing BENER.
  5. @Tabel (jeneng = "AUTHOR") ngiket kelas Book menyang tabel DB AUTHOR.
  6. @Id ujar manawa lapangan iki minangka kunci utama.
  7. @GeneratedValue (strategi = GenerationType.IDENTITY) - strategi generasi kunci utama.
  8. @Column (jeneng = "ID", nullable = palsu) nggandhengake lapangan karo atribut DB, lan uga ngandika yen lapangan DB diwenehi ora bisa null. Iki uga migunani nalika ngasilake tabel saka entitas. Proses mbalikke carane kita saiki nggawe project kita, iki perlu ing DBs test kanggo tes Unit.
  9. @OneToOne ujar manawa kolom kasebut minangka lapangan hubungan siji-kanggo-siji.
  10. @JoinColumn (jeneng = "BOOK_ID", unik = bener, nullable = palsu) - kolom BOOK_ID bakal digawe, kang unik lan ora null.
Ing sisih mbalikke (ing kelas Book ), kita uga kudu nggawe sambungan One-to-One lan nuduhake lapangan ing ngendi pemetaan kasebut dumadi. @OneToOne(mappedBy = "buku") - ing conto iki, iki lapangan buku saka kelas Pengarang. JPA bakal nyambungake dhewe. Sepisanan, bisa uga katon ana kekacoan anotasi, nanging nyatane trep banget lan kanthi pengalaman sampeyan bakal nambah kanthi otomatis tanpa mikir.
  1. Saiki ayo konfigurasi Hibernate. Kanggo nindakake iki, gawe file 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>
Katrangan saka properti :
  1. hibernate.dialect yaiku dialek DBMS sing wis dipilih.
  2. hibernate.connection.driver_class - Kelas driver DB kita.
  3. hibernate.connection.url - utl DB kita. Sampeyan bisa njupuk saka titik pisanan ngendi kita ngatur DB.
  4. hibernate.connection.username - jeneng panganggo DB.
  5. hibernate.connection.password — sandi pangguna DB.
  6. hibernate.hbm2ddl.auto - nyetel generasi tabel. Yen nganyari, banjur ora ngasilake yen wis digawe, nanging mung nganyari.
  7. hibernate.show_sql - apa arep nuduhake pitakon DB.
  8. hibernate.format_sql - apa arep ngowahi format pitakon DB. Yen ora, kabeh bakal ana ing siji baris. Aku nyaranake nguripake.
  9. hibernate.use_sql_comments - komentar pitakon DB. Yen iki Insert, banjur komentar ditulis ing ndhuwur panjalukan sing panjalukan saka jinis Insert.
  10. hibernate.generate_statistics - ngasilake log. Aku nyaranake lan nyaranake nyetel log kanthi maksimal. Maca log bakal nambah kemungkinan sampeyan bisa nggarap ORM kanthi bener.
  11. hibernate.jdbc.batch_size - Ukuran kumpulan maksimal.
  12. hibernate.jdbc.fetch_size - Ukuran njupuk maksimum.
  13. hibernate.order_inserts - ngidini sisipan dinamis.
  14. hibernate.order_updates - Ngidini nganyari dinamis.
  15. hibernate.jdbc.batch_versioned_data - ngidini batching. Deleng DBMS sampeyan: ora kabeh wong ndhukung iki.
  16. kelas pemetaan - kelas sing entitas kita. Kabeh kudu didaftar.
  1. Saiki hakekat kita kudu ditemtokake. Kita bisa mriksa iki ing tab persistensi:

    Entitas JPA lan Hubungan DB - 11

    asil:

    Entitas JPA lan Hubungan DB - 12
  2. Kita uga kudu ngatur data:

    Entitas JPA lan Hubungan DB - 13 Entitas JPA lan Hubungan DB - 14

    Asil: Kita wis nindakake pemetaan One-to-One. Materi kasebut mung kanggo informasi, rincian ana ing referensi.

Hubungan Siji-Kanggo-Many

Link menyang cabang kene . Aku ora bakal ngirim kode maneh ing artikel, amarga wis dawa banget. Kita ndeleng kabeh kode ing GitHub.
  1. Minangka asil ngeksekusi skrip inisialisasi, kita entuk:

    Entitas JPA lan Hubungan DB - 15

    Apa sampeyan rumangsa beda karo tabel sadurunge?

  2. Diagram:

    Entitas JPA lan Hubungan DB - 16

    One-to-Many Relationship - siji penulis bisa duwe sawetara buku. Entitas kiwa cocog karo siji utawa luwih sing tengen.

  3. Bentenipun ing pemetaan bakal ana ing anotasi lan kolom:

    Lapangan katon ing kelas Pengarang :

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

    Iki wis dadi set, amarga kita bisa duwe sawetara buku. @OneToMany ngomong babagan jinis sikap. FetchType.Lazy ngandika sing kita ora perlu kanggo mbukak kabeh dhaftar buku yen ora kasebut ing request. Sampeyan uga kudu nyatakake yen lapangan iki ora bisa ditambahake menyang toString, yen ora, kita bakal miwiti ngrokok StackOverflowError. Lombok sing daktresnani ngurus iki:

    @ToString(exclude = "books")

    Ing kelas Buku , kita menehi umpan balik Many-to-One:

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

    Ing kene kita nyimpulake yen One-to-Many minangka gambar pangilon saka Many-to-One lan kosok balene. Perlu ditekanake manawa Hibernate ora ngerti apa-apa babagan komunikasi bidirectional. Kanggo dheweke, iki rong sambungan sing beda: siji ing arah siji, liyane ing arah ngelawan.

  4. Ora ana owah-owahan ing hibernate.cfg.xml .

  5. Ketekunan:

    Entitas JPA lan Hubungan DB - 17

Hubungan Akeh-kanggo-Siji

Wiwit Akeh-kanggo-Siji minangka gambar pangilon saka One-to-Many, bakal ana sawetara bedane. Link menyang cabang kene .
  1. Minangka asil ngeksekusi skrip inisialisasi, kita entuk asil ing ngisor iki:

    Entitas JPA lan Hubungan DB - 18
  2. Diagram:

    Entitas JPA lan Hubungan DB - 19
  3. Bentenipun ing pemetaan bakal ana ing anotasi lan kolom:

    Ora ana set maneh ing kelas Penulis , amarga wis pindhah menyang kelas Buku .

  4. hibernate.cfg.xml

  5. Ketekunan:

    Entitas JPA lan Hubungan DB - 20

Akeh-kanggo-Many Hubungan

Ayo pindhah menyang hubungan sing paling menarik. Hubungan iki, miturut kabeh aturan kesopanan lan indecency, digawe liwat meja tambahan. Nanging tabel iki dudu entitas. Menarik, ta? Ayo padha ndeleng telek iki. Link menyang cabang kene .
  1. Deleng skrip initialization , tabel HAS tambahan katon ing kene. Kita njaluk kaya penulis-wis-buku.

    Minangka asil eksekusi skrip, kita bakal entuk tabel ing ngisor iki:

    Entitas JPA lan Hubungan DB - 21
  2. Diagram:

    Entitas JPA lan Hubungan DB - 22

    Ing conto kita, ternyata buku bisa duwe akeh penulis, lan penulis bisa duwe akeh buku. Padha bisa tumpang tindih.

  3. Kelas pemetaan bakal duwe set ing kelas. Nanging kaya sing dakkandhakake, tabel HAS dudu entitas.

    Kelas Penulis :

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

    @ManyToMany minangka jinis hubungan.

    @JoinTable - iki persis sing bakal nyambungake atribut karo tabel HAS tambahan. Ing kono kita nemtokake rong atribut sing bakal nuduhake kunci utama saka rong entitas.

    Kelas Buku :

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

    Ing kene kita nuduhake FetchType lan lapangan sing bakal digunakake kanggo peta.

  4. Kita hibernate.cfg.xml maneh tetep panggah (Aku ora njupuk menyang akun kasunyatan sing kita nggawe DB anyar kanggo saben cabang).

  5. Ketekunan:

    Entitas JPA lan Hubungan DB - 23

Debriefing

Dadi, kita wis nliti jinis hubungan DB kanthi superfisial lan nemtokake cara ngetrapake ing model ORM. Kita nulis proyek tes sing nuduhake kabeh sambungan, lan ngerti carane ngatur hibernate / jpa. Phew.

pranala migunani

Artikelku sadurunge: PS Bisa uga ana kesalahan lan kekurangan ing teks. PPS Penulis ngrokok ana sing aneh nalika nulis artikel iki. Matur nuwun kanggo perhatian sampeyan!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION