JavaRush /Blog Jawa /Random-JV /Aplikasi Hibernate pisanan sampeyan

Aplikasi Hibernate pisanan sampeyan

Diterbitake ing grup
Ing artikel iki, sampeyan bakal kenal karo salah sawijining kerangka perusahaan sing paling populer kanggo Jawa lan nggawe aplikasi pisanan sampeyan nggunakake Hibernate. Ora tau krungu babagan Hibernate? Mungkin sampeyan wis krungu babagan iki, nanging durung digunakake? Utawa nyoba miwiti, nanging ora kasil? Ing kabeh telung kasus, welcome to cut :) Aplikasi Hibernate pisanan sampeyan - 1Hello everyone! Ing artikel iki, aku bakal ngomong babagan fitur utama kerangka Hibernate lan mbantu sampeyan nulis aplikasi mini pisanan sampeyan. Kanggo iki kita kudu:
  1. Intellij Idea Ultimate Edition;
    Ngundhuh saka situs web resmi lan aktifake versi nyoba 30 dina.
  2. PostgeSQL minangka salah sawijining sistem manajemen basis data modern (DBMS) sing paling populer;
  3. Maven (wis dibangun menyang IDEA);
  4. Sabar sithik.
Artikel kasebut utamane kanggo wong-wong sing durung nate nggarap teknologi iki, saengga jumlah kode bisa dikurangi. Ayo dadi miwiti!

Apa Hibernate?

Iki minangka salah sawijining implementasi model ORM sing paling populer. Model obyek-relasional nggambarake hubungan antarane obyek piranti lunak lan cathetan ing basis data. Mesthine, fungsi Hibernate jembar banget, nanging kita bakal fokus ing fungsi sing paling gampang. Tujuan kita: nggawe aplikasi CRUD (Gawe, Waca, Nganyari, Busak) sing bakal bisa:
  1. Nggawe pangguna (Panganggo), uga telusuran ing basis data kanthi ID, nganyari data ing basis data, lan uga mbusak saka database.
  2. Nemtokake obyek kendaraan (Otomatis) kanggo pangguna. Nggawe, ngowahi, nemokake lan mbusak mobil saka database.
  3. Kajaba iku, aplikasi kasebut kudu mbusak mobil "yatim piatu" kanthi otomatis saka database. Sing. Nalika pangguna dibusak, kabeh mobil duweke uga kudu dibusak saka database.
Struktur proyek kita bakal kaya ing ngisor iki: Aplikasi Hibernate pisanan sampeyan - 2Nalika sampeyan bisa ndeleng, ora ana sing rumit. 6 kelas + 1 file karo configs. Pisanan, ayo nggawe proyek maven anyar ing Intellij Idea. File -> Proyek Anyar. Saka jinis project ngajokaken, pilih Maven lan nerusake. Aplikasi Hibernate pisanan sampeyan - 3Apache Maven minangka kerangka kanggo ngotomatisasi pangumpulan proyek adhedhasar deskripsi strukture ing file ing basa POM. Struktur kabeh proyek sampeyan bakal diterangake ing file pom.xml, sing bakal digawe IDEA dhewe ing oyod proyek sampeyan. Ing setelan proyek sampeyan kudu nemtokake parameter Maven - groupId lan artifactId. Biasane ing projects groupId iku jeneng organisasi utawa divisi, lan jeneng domain saka organisasi utawa situs project ditulis ing kono. Sabanjure, artifactId minangka jeneng proyek kasebut. Kanggo groupdId sampeyan bisa nemtokake com.вашНикнейм.javarush, iki ora bakal mengaruhi operasi aplikasi ing sembarang cara. Kanggo artifactId, pilih jeneng proyek sing disenengi. Sampeyan uga bisa ninggalake Versi ora diganti. Aplikasi Hibernate pisanan sampeyan - 4Ing layar pungkasan, mung konfirmasi data sing sampeyan lebokake sadurunge. Aplikasi Hibernate pisanan sampeyan - 5Dadi, kita wis nggawe proyek kasebut, sing isih ana yaiku nulis kode lan nggawe kerjane :) Kaping pisanan, yen kita pengin nggawe aplikasi sing bisa digunakake karo database, mesthine ora bisa ditindakake tanpa database! Download PostgreSQL saka kene (Aku nggunakake versi 9). PostgreSQL duwe pangguna standar 'postgres', sampeyan kudu nggawe sandhi nalika instalasi. Aja lali sandi, kita bakal mbutuhake iku mengko! (Umum, nggunakake database standar ing aplikasi iku laku ala, nanging kanggo ngurangi jumlah wasir, kita bakal nggawe apa karo nggawe database kita dhewe). Yen sampeyan ora kepenak karo baris perintah lan pitakon SQL, ana kabar apik. Intellij IDEA nyedhiyakake antarmuka panganggo sing cukup cocok kanggo nggarap database. Katon kaya iki: Aplikasi Hibernate pisanan sampeyan - 6(dumunung ing sidebar tengen IDEA, tab Database) Kanggo nggawe sambungan, klik "+", pilih panyedhiya kita (PostgeSQL). Isi kolom karo pangguna, jeneng database (loro postgres) lan ketik sandhi sing sampeyan aturake nalika nginstal PostgreSQL. Yen perlu, download driver Postgres, iki bisa rampung ing kaca sing padha. Klik "Test Connection" kanggo mriksa manawa sambungan menyang database wis digawe. Yen sampeyan ndeleng prasasti "Sukses", kita nerusake. Saiki ayo nggawe tabel sing dibutuhake. Bakal ana loro - pangguna lan otomatis. Parameter kanggo tabel pangguna: Aplikasi pisanan sampeyan ing Hibernate - 7Elinga yen id minangka kunci utama. Yen sampeyan ora ngerti apa kunci utama ing SQL, Google iku penting. Setelan kanggo tabel autos: Aplikasi pisanan sampeyan ing Hibernate - 8Kanggo autos sampeyan kudu ngatur Foreign Key - tombol manca. Iku bakal ngubungake tabel kita. Aku menehi saran supaya maca liyane babagan dheweke; Kanggo nyelehake kanthi gampang, iki nuduhake tabel eksternal, ing kasus kita, pangguna. Yen mobil duweke pangguna karo id=1, banjur ing kolom user_id ing tabel autos bakal duwe 1. Iki carane kita nyambungake pangguna karo mobil ing aplikasi kita. Ing tabel autos kita, kolom user_id bakal dadi kunci asing. Bakal ngrujuk menyang kolom id saka tabel pangguna. Aplikasi Hibernate pisanan sampeyan - 9Mangkono, kita wis nggawe database karo rong tabel. Iku tetep kanggo ngerti carane ngatur saka kode Jawa. Kita bakal miwiti karo file pom.xml, ing ngendi kita kudu nyakup perpustakaan sing dibutuhake (ing basa Maven diarani dependensi). Kabeh perpustakaan disimpen ing repositori Maven tengah. Wong-wong mau sing sampeyan nemtokake ing pom.xml, sampeyan bisa nggunakake ing project. Pom.xml sampeyan kudu katon kaya iki: Aplikasi Hibernate pisanan sampeyan - 10Ora ana sing rumit kaya sing sampeyan deleng. Kita nambahake mung 2 dependensi - kanggo nggunakake PostgreSQL lan Hibernate. Saiki ayo pindhah menyang kode Jawa. Gawe kabeh paket lan kelas sing dibutuhake kanggo proyek kasebut. Kanggo miwiti, kita butuh model data - kelas Userlan Auto.
package models;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity
@Table (name = "users")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column(name = "name")
    private String name;
    //you can not specify Column name if it matches the name of the column in the table
    private int age;

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Auto> autos;

    public User() {
    }

    public User(String name, int age) {
        this.name = name;
        this.age = age;
        autos = new ArrayList<>();
    }

    public void addAuto(Auto auto) {
        auto.setUser(this);
        autos.add(auto);
    }

    public void removeAuto(Auto auto) {
        autos.remove(auto);
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public List<Auto> getAutos() {
        return autos;
    }

    public void setAutos(List<Auto> autos) {
        this.autos = autos;
    }

    @Override
    public String toString() {
        return "models.User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
package models;

import javax.persistence.*;

@Entity
@Table(name = "autos")
public class Auto {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column (name = "model")
    private String model;

    //you can not specify Column name if it matches the name of the column in the table
    private String color;


    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;

    public Auto() {
    }

    public Auto(String model, String color) {
        this.model = model;
        this.color = color;
    }

    public int getId() {
        return id;
    }

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public String toString() {
        return color + " " + model;
    }
}
Kaya sing sampeyan ngerteni, kelas kasebut dilengkapi karo anotasi sing isih ora jelas. Ayo dadi miwiti menehi hasil karo wong-wong mau. Anotasi utama kanggo kita yaiku @Entity. Waca babagan ing Wikipedia lan elinga kabeh, iki minangka dhasar dhasar. Anotasi iki ngidini obyek Java saka kelas sampeyan digandhengake karo database. Kanggo kelas dadi entitas, kudu memenuhi syarat ing ngisor iki:
  • Kudu duwe konstruktor kosong ( publicutawa protected);
  • Ora bisa nested, antarmuka utawa enum;
  • Ora bisa finallan ora bisa ngemot final-fields / properti;
  • Kudu ngemot paling ora siji kolom @Id.
Priksa kelas entitas sampeyan, iki minangka papan sing populer kanggo njupuk dhewe ing sikil. Iku gampang banget kanggo lali soko. Ing kasus iki, entitas bisa:
  • Ngandhut konstruktor sing ora kosong;
  • Kanggo diwarisake lan diwarisake;
  • Ngemot cara liyane lan ngleksanakake antarmuka.
Kaya sing sampeyan ngerteni, kelas kasebut Usermeh padha karo tabel pangguna. Ana sawah id,, name. ageAnotasi sing ana ing ndhuwur ora mbutuhake panjelasan akeh: wis jelas yen @Id minangka indikasi yen lapangan kasebut minangka pengenal obyek saka kelas iki. Anotasi @Table ing ndhuwur kelas nemtokake jeneng tabel ing ngendi obyek kasebut ditulis. Priksa manawa komentar ing ndhuwur kolom umur: yen jeneng lapangan ing kelas lan tabel padha, sampeyan ora kudu nambah anotasi @Column, bakal bisa kaya ngono. Babagan "strategi = GenerationType.IDENTITY" sing dituduhake ing kurung: ana sawetara strategi generasi ID. Sampeyan bisa google, nanging ing framework saka aplikasi kita ora perlu repot. Wangsulan: Bab ingkang utama iku id kanggo obyek kita bakal kui kanthi otomatis, supaya ora ana setter kanggo id, lan kita uga ora nemtokake ing konstruktor. UserNanging, kelas kasebut tetep katon ing sawetara cara . Dheweke duwe dhaptar mobil! Anotasi @OneToMany katon ing ndhuwur dhaptar. Iki tegese siji obyek saka kelas pangguna bisa cocog karo sawetara mesin. Setelan "mappedBY" nuduhake lapangan pangguna kelas Auto. Kanthi cara iki, mesin lan pangguna disambungake. Setelan orphanRemoval nerjemahake kanthi apik saka basa Inggris - "remove orphans". Yen kita mbusak pangguna saka database, kabeh mobil sing digandhengake karo dheweke uga bakal dibusak. Sabanjure, ing kelas Autosampeyan bakal weruh kolom pangguna kanthi anotasi @ManyToOne (akeh Auto bisa cocog karo siji pangguna) lan anotasi @JoinColumn. Iku nuduhake liwat kang kolom ing tabel autos sambungan karo tabel kedhaftar ana (kunci manca padha sing kita ngomong bab sadurungé). Sawise nggawe model data, iku wektu kanggo mulang program kita kanggo nindakake operasi ing data iki ing database. Ayo miwiti karo kelas utilitas HibernateSessionFactoryUtil. Wis mung siji tugas - kanggo nggawe pabrik sesi kanggo aplikasi kita bisa nggarap database (halo, pola "Pabrik!"). Dheweke ora bisa nindakake apa-apa liyane.
package utils;

import models.Auto;
import models.User;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

public class HibernateSessionFactoryUtil {
    private static SessionFactory sessionFactory;

    private HibernateSessionFactoryUtil() {}

    public static SessionFactory getSessionFactory() {
        if (sessionFactory == null) {
            try {
                Configuration configuration = new Configuration().configure();
                configuration.addAnnotatedClass(User.class);
                configuration.addAnnotatedClass(Auto.class);
                StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
                sessionFactory = configuration.buildSessionFactory(builder.build());

            } catch (Exception e) {
                System.out.println("Exception!" + e);
            }
        }
        return sessionFactory;
    }
}
Ing kelas iki, kita nggawe obyek konfigurasi anyar, Konfigurasi, lan pass menyang kelas sing kudu dianggep minangka entitas - Userlan Auto. Pay manungsa waé menyang cara configuration.getProperties(). Apa sifat liyane? ngendi? Properties minangka paramèter kanggo cara hibernate, sing ditemtokake ing file khusus hibernate.cfg.xml. Aplikasi Hibernate pisanan sampeyan - 11Hibernate.cfg.xml diwaca kene: new Configuration().configure(); Nalika sampeyan bisa ndeleng, ana apa-apa khusus ing - paramèter kanggo nyambung menyang database, lan show_sql parameter khusus. Dibutuhake supaya kabeh pitakon SQL sing bakal ditindakake hibernasi marang basis data kita bakal dikirim menyang konsol. Kanthi cara iki, sampeyan bakal bisa ndeleng persis apa sing ditindakake Hibernate ing saben wektu lan nyingkirake efek "sihir". Sabanjure kita kudu kelas UserDAO. (Kanthi cara sing apik, sampeyan kudu program liwat antarmuka - nggawe antarmuka UserDAOlan ngleksanakake kanthi kapisah UserDAOImpl, nanging kanggo ngurangi jumlah kode aku bakal ngilangi iki. Aja nindakake iki ing proyek nyata!). DAO (obyek akses data) minangka salah sawijining pola desain sing paling umum, "Akses Data". Tegese prasaja - kanggo nggawe lapisan ing aplikasi sing tanggung jawab mung kanggo ngakses data, lan ora liya. Entuk data saka database, nganyari data, mbusak data - lan iku. Waca liyane babagan DAO; sampeyan bakal terus digunakake ing pakaryan sampeyan. Kelas kita bisa apa UserDao? Bener, kaya kabeh DAO, mung bisa digunakake karo data. Temokake pangguna kanthi id, nganyari data, mbusak dheweke, tarik dhaptar kabeh pangguna saka database utawa simpen pangguna anyar ing basis data - iku kabeh fungsine.
package dao;

import models.Auto;
import models.User;
import org.hibernate.Session;
import org.hibernate.Transaction;
import utils.HibernateSessionFactoryUtil;
import java.util.List;

public class UserDao {

    public User findById(int id) {
        return HibernateSessionFactoryUtil.getSessionFactory().openSession().get(User.class, id);
    }

    public void save(User user) {
        Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession();
        Transaction tx1 = session.beginTransaction();
        session.save(user);
        tx1.commit();
        session.close();
    }

    public void update(User user) {
        Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession();
        Transaction tx1 = session.beginTransaction();
        session.update(user);
        tx1.commit();
        session.close();
    }

    public void delete(User user) {
        Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession();
        Transaction tx1 = session.beginTransaction();
        session.delete(user);
        tx1.commit();
        session.close();
    }

    public Auto findAutoById(int id) {
        return HibernateSessionFactoryUtil.getSessionFactory().openSession().get(Auto.class, id);
    }

    public List<User> findAll() {
        List<User> users = (List<User>)  HibernateSessionFactoryUtil.getSessionFactory().openSession().createQuery("From User").list();
        return users;
    }
}
Cara UserDaosing padha karo saben liyane. Umume, kita nampa obyek Sesi (sesi nyambungake menyang database) nggunakake Pabrik Sesi kita, nggawe transaksi siji ing sesi iki, nindakake transformasi data sing perlu, nyimpen asil transaksi ing database lan nutup sesi. Cara dhewe, kaya sing sampeyan ngerteni, cukup prasaja. DAO minangka "jantung" aplikasi kita. Nanging, kita ora bakal nggawe DAO langsung lan nelpon metode kasebut ing main(). Kabeh logika bakal dipindhah menyang UserService.
package services;

import dao.UserDao;
import models.Auto;
import models.User;

import java.util.List;

public class UserService {

    private UserDao usersDao = new UserDao();

    public UserService() {
    }

    public User findUser(int id) {
        return usersDao.findById(id);
    }

    public void saveUser(User user) {
        usersDao.save(user);
    }

    public void deleteUser(User user) {
        usersDao.delete(user);
    }

    public void updateUser(User user) {
        usersDao.update(user);
    }

    public List<User> findAllUsers() {
        return usersDao.findAll();
    }

    public Auto findAutoById(int id) {
        return usersDao.findAutoById(id);
    }


}
Layanan minangka lapisan data ing aplikasi sing tanggung jawab kanggo nglakokake logika bisnis. Yen program sampeyan kudu nindakake sawetara logika bisnis, iku nindakake liwat layanan. Layanan kasebut ngemot dhewe UserDaolan nelpon metode DAO ing metode kasebut. Iki bisa uga katon kaya duplikasi fungsi kanggo sampeyan (napa ora mung nelpon metode saka obyek dao), nanging kanthi obyek sing akeh lan logika sing rumit, ngrusak aplikasi dadi lapisan duweni keuntungan gedhe (iki praktik sing apik, elinga informasi iki kanggo masa depan lan maca babagan "lapisan aplikasi" "). Ing layanan kita, logika prasaja, nanging ing proyek nyata, metode layanan bakal ngemot luwih saka siji baris kode :) Saiki kita duwe kabeh sing dibutuhake supaya aplikasi bisa digunakake! Ayo nggawe main()pangguna lan mesin kanggo dheweke ing cara, sambungake menyang saben liyane lan simpen ing database.
import models.Auto;
import models.User;
import services.UserService;

import java.sql.SQLException;

public class Main {
    public static void main(String[] args) throws SQLException {

        UserService userService = new UserService();
        User user = new User("Masha",26);
        userService.saveUser(user);
        Auto ferrari = new Auto("Ferrari", "red");
        ferrari.setUser(user);
        user.addAuto(ferrari);
        Auto ford = new Auto("Ford", "black");
        ford.setUser(user);
        user.addAuto(ford);
        userService.updateUser(user);
    }
}
Kaya sing sampeyan ngerteni, tabel pangguna duwe entri dhewe, lan tabel autos duwe dhewe. Aplikasi Hibernate pisanan sampeyan - 13Aplikasi Hibernate pisanan sampeyan - 14Ayo coba ganti jeneng pangguna. Ayo mbusak tabel pangguna lan mbukak kode kasebut
import models.Auto;
import models.User;
import services.UserService;

import java.sql.SQLException;

public class Main {
    public static void main(String[] args) throws SQLException {

        UserService userService = new UserService();
        User user = new User("Masha",26);
        userService.saveUser(user);
        Auto ferrari = new Auto("Ferrari", "red");
        user.addAuto(ferrari);
        Auto ford = new Auto("Ford", "black");
        ford.setUser(user);
        user.addAuto(ford);
        userService.updateUser(user);
        user.setName("Sasha");
        userService.updateUser(user);
    }
}
Nyambut gawe! Aplikasi Hibernate pisanan sampeyan - 15Apa yen sampeyan mbusak pangguna? Ayo mbusak tabel pangguna (otomatis bakal mbusak dhewe) lan nglakokake kode kasebut
import models.Auto;
import models.User;
import services.UserService;

import java.sql.SQLException;

public class Main {
    public static void main(String[] args) throws SQLException {

        UserService userService = new UserService();
        User user = new User("Masha",26);
        userService.saveUser(user);
        Auto ferrari = new Auto("Ferrari", "red");
        user.addAuto(ferrari);
        Auto ford = new Auto("Ford", "black");
        ford.setUser(user);
        user.addAuto(ford);
        userService.updateUser(user);
        user.setName("Sasha");
        userService.updateUser(user);
        userService.deleteUser(user);
    }
}
Lan tabel kita kosong (nggatekake konsol, kabeh pitakon sing wis ditindakake Hibernate bakal ditampilake ing kana). Sampeyan bisa muter-muter karo aplikasi lan nyoba kabeh fitur. Contone, nggawe pangguna nganggo mesin, simpen ing database, deleng ID apa sing ditugasake, lan coba gunakake cara main()kanggo "narik" pangguna saka database kanthi id iki lan nampilake dhaptar mesin ing konsol. . Mesthi wae, kita mung ndeleng bagean cilik saka fungsi Hibernate. Kapabilitas sing amba banget, lan wis suwe dadi salah sawijining standar industri kanggo pangembangan Jawa. Yen sampeyan pengin sinau kanthi rinci, aku bisa menehi rekomendasi buku "Java Persistence API and Hibernate", sing dakdeleng ing salah sawijining artikel sadurunge. Muga-muga artikel iki migunani kanggo para pamaca. Yen sampeyan duwe pitakon, takon ing komentar, aku bakal seneng njawab :) Uga, aja lali ndhukung penulis ing kompetisi kanthi "Seneng" dheweke. Utawa luwih apik - "Aku seneng banget" :) Good luck ing pasinaon!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION