CodeGym /Blog Jawa /Acak /Aplikasi Hibernate pisanan sampeyan
John Squirrels
tingkat
San Francisco

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 Hibernate pisanan sampeyan. Ora tau krungu babagan Hibernate? Utawa Mungkin sampeyan wis krungu bab iku, nanging durung digunakake? Utawa Mungkin sampeyan nyoba kanggo nggunakake, nanging gagal? Ing kabeh telung kasus - welcome to ngisor potong :) Aplikasi Hibernate pisanan sampeyan - 1 Hello, 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
    Unduh saka situs web resmi lan aktifake versi nyoba 30 dina.
  2. PostgreSQL - salah sawijining sistem manajemen basis data modern (DBMS) sing paling populer
  3. Maven (wis disambungake menyang IDEA)
  4. Sabar sithik.
Ing kasus, aku ngirim kode aplikasi ing GitHub (cabang codegym). Artikel kasebut utamane kanggo wong-wong sing durung tau nggarap teknologi iki, mula aku wis nyilikake jumlah kode. Ayo dadi miwiti!

Apa Hibernate?

Iki minangka salah sawijining implementasi pemetaan obyek-relasional (ORM) sing paling populer. Pemetaan obyek-relasional nemtokake hubungan antarane obyek piranti lunak lan rekaman database. Mesthine, Hibernate nduweni fungsi sing wiyar, nanging kita bakal fokus ing fungsi sing paling gampang. Tujuane yaiku nggawe aplikasi CRUD (Gawe, Waca, Nganyari, Busak) sing bakal bisa:
  1. Gawe pangguna (Panganggo), goleki ing basis data kanthi ID, nganyari data ing basis data, lan mbusak saka database.
  2. Nemtokake obyek mobil (Otomatis) kanggo pangguna. Nggawe, nganyari, nemokake, lan mbusak mobil saka database.
  3. Kajaba iku, aplikasi kasebut kudu mbusak mobil "ora duwe" saka database kanthi otomatis. Ing tembung liyane, nalika pangguna wis dibusak, kabeh mobil gadhahanipun pangguna uga kudu dibusak saka database.
Proyek kita bakal kabentuk kaya iki: Aplikasi Hibernate pisanan sampeyan - 2Nalika sampeyan bisa ndeleng, ora ana sing rumit. 6 kelas + 1 file karo configs. Pisanan, gawe proyek Maven anyar ing IntelliJ IDEA. File -> Proyek Anyar. Pilih Maven saka antarane jinis proyek sing diusulake lan pindhah menyang langkah sabanjure. Aplikasi Hibernate pisanan sampeyan - 3Apache Maven minangka kerangka kanggo mbangun proyek kanthi otomatis adhedhasar katrangan strukture ing file POM. Struktur kabeh proyek sampeyan bakal diterangake ing pom.xml, file sing bakal digawe IDEA dhewe ing oyod proyek sampeyan. Ing setelan proyek, sampeyan kudu nemtokake setelan Maven ing ngisor iki: groupId lan artifactId. Ing proyek, groupId biasane minangka gambaran saka perusahaan utawa unit bisnis. Jeneng domain perusahaan utawa situs web bisa mlebu ing kene. Sabanjure, artifactId minangka jeneng proyek kasebut. Kanggo groupdId, sampeyan bisa ngetik com.yourNickname.codegym. Iki ora bakal duwe pengaruh ing aplikasi. Kanggo artifactId, pilih jeneng proyek sing disenengi. Versi bisa ditinggalake ora diganti. Aplikasi Hibernate pisanan sampeyan - 4Ing layar pungkasan, mung konfirmasi data sing dilebokake sadurunge.Aplikasi Hibernate pisanan sampeyan - 5Dadi, kita nggawe proyek kasebut. Saiki sing kudu ditindakake yaiku nulis sawetara kode lan bisa digunakake :) Kaping pisanan: yen kita pengin nggawe aplikasi sing bisa digunakake karo basis data, kita mesthi ora bisa nindakake tanpa database! Download PostgreSQL saka kene (Aku nggunakake versi 9). PostgreSQL duwe 'postgres' pangguna standar - sampeyan kudu mikirake sandhi nalika nginstal. Aja lali sandi. Kita bakal butuh mengko! (Umum, nggunakake database standar ing aplikasi iku laku ala, nanging kita bakal nindakake iku kanggo ngurangi jumlah ulcers nimbulaké dening nggawe database dhewe). Yen sampeyan ora kanca karo baris perintah lan pitakon SQL, ana kabar apik. IntelliJ IDEA nyedhiyakake antarmuka pangguna sing cocog kanggo nggarap database. Aplikasi Hibernate pisanan sampeyan - 6(dumunung ing panel tengen IDEA, tab Database). Kanggo nggawe sambungan, klik "+" banjur pilih sumber data kita (PostgeSQL). Isi kolom kanggo pangguna lan database ("postgres" kanggo loro-lorone) lan ketik sandhi sing disetel nalika instalasi PostgreSQL. Yen perlu, download driver Postgres. Sampeyan bisa nindakake iki ing kaca sing padha. Klik "Test Connection" kanggo verifikasi manawa sambungan database wis digawe. Yen sampeyan ndeleng "Sukses", banjur nerusake. Saiki kita bakal nggawe tabel sing dibutuhake. Bakal ana total loro: pangguna lan otomatis. Parameter kanggo tabel pangguna: Aplikasi Hibernate pisanan sampeyan - 7Elinga yen id minangka kunci utama. Yen sampeyan ora ngerti apa kunci utama ing SQL, Google iku. Iki penting. Setelan kanggo tabel otomatis: Aplikasi Hibernate pisanan sampeyan - 8Kanggo tabel autos, sampeyan kudu ngatur tombol manca. Iku bakal ngawula kanggo link kita tabel. Aku menehi saran sing maca liyane babagan. Cukup, referensi tabel eksternal, ing kasus kita, pangguna. Yen mobil duweke pangguna kanthi id = 1, kolom user_id saka autos bakal padha karo 1. Iki carane kita nggandhengake pangguna karo mobil ing aplikasi kita. Ing tabel autos kita, kolom user_id bakal tumindak minangka kunci asing. Bakal ngrujuk menyang kolom id saka tabel pangguna. Aplikasi Hibernate pisanan sampeyan - 9Dadi, kita wis nggawe database kanthi rong tabel. Sing isih ana yaiku ngerti carane ngatur saka kode Jawa. Kita bakal miwiti karo file pom.xml, kang kita kudu kalebu perpustakaan perlu (ing Maven padha disebut dependensi). Kabeh perpustakaan disimpen ing repositori Maven tengah. Pustaka sing sampeyan nemtokake ing pom.xml kasedhiya kanggo sampeyan gunakake ing proyek kasebut. 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 ing proyek kasebut. Kanggo miwiti, kita butuh model data: Userlan Autokelas.

 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 omit the Column attribute if the name property matches the column name 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 omit the Column attribute if the name property matches the column name 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 duwe akeh anotasi sing ora jelas. Ayo dadi miwiti digging menyang wong. Kanggo kita, anotasi utama yaiku @Entity. Waca babagan iki ing Wikipedia lan sinau kabeh kanthi ati-ati. Iki minangka pondasi dhasar. Anotasi iki ngidini obyek saka kelas Jawa dipetakan menyang database. Kanggo kelas dadi entitas, kudu nyukupi syarat ing ngisor iki:
  • Sampeyan kudu duwe konstruktor kosong ( publicutawa protected)
  • Iku ora bisa nested, antarmuka utawaenum
  • Ora bisa finallan ora bisa duwe finallapangan / properti
  • Sampeyan kudu paling ora siji lapangan @Id.
Priksa kelas entitas sampeyan: iku panggonan sing populer banget kanggo njupuk dhewe ing sikil. Iku gampang banget kanggo lali soko. Kajaba iku, entitas bisa nindakake ing ngisor iki:
  • Bisa duwe konstruktor sing ora kosong
  • Bisa warisan lan bisa diwarisake
  • Bisa duwe cara liyane lan ngleksanakake antarmuka.
Kaya sing sampeyan ngerteni, Userkelas kasebut meh padha karo tabel pangguna. Wis id, name, lanagesawah. Anotasi sing ana ing ndhuwur ora mbutuhake panjelasan tartamtu: jelas yen @Id nuduhake yen lapangan kasebut minangka pengenal obyek saka kelas iki. Anotasi @Table ing ndhuwur kelas nuduhake jeneng tabel ing ngendi obyek ditulis. Wigati komentar ing ndhuwur kolom umur: yen jeneng kolom ing kelas padha karo jeneng tabel, sampeyan bisa ngilangi @Column anotasi lan bakal bisa digunakake. Minangka kanggo bagean dituduhake ing penyonggo ("strategi = GenerationType.IDENTITY"): ana sawetara Sastranegara kanggo nggawe ID. Sampeyan bisa Google, nanging kanggo aplikasi kita, ora perlu repot. Sing utama yaiku kanggo obyek kita, nilai id bakal digawe kanthi otomatis. Patut, ora ana setter kanggo id, lan kita uga ora nyetel ing konstruktor. Nanging,Userkelas katon metu. Wis dhaptar mobil! Aplikasi Hibernate pisanan sampeyan - 11Anotasi @OneToMany digantung ing ndhuwur dhaptar. Tegese sawetara mobil bisa cocog karo obyek sing padha ing kelas Panganggo. Unsur "mappedBy" nuduhake lapangan pangguna kelas kasebut Auto. Mangkono, mobil lan pangguna ana hubungane. Elemen orphanRemoval nuduhake manawa arep ngetrapake operasi mbusak menyang entitas sing ora ana hubungane maneh. Yen kita mbusak pangguna saka database, kabeh mobil sing digandhengake karo iku uga bakal dibusak. Ing siji, ingAutokelas, sampeyan bakal weruh lapangan pangguna karo @ManyToOne anotasi (siji Pangguna bisa cocog karo akeh Autos) lan @JoinColumn anotasi. Iki nuduhake kolom ing tabel autos sing digunakake kanggo ngrujuk tabel pangguna (yaiku kunci asing sing wis dirembug sadurunge). Sawise nggawe model data, iku wektu kanggo mulang program kita kanggo nindakake operasi karo data ing database. Ayo miwiti karo kelas utilitas HibernateSessionFactoryUtil. Ana mung siji proyek - nggawe pabrik sesi kanggo aplikasi kita bisa nggarap database (ngomong hello kanggo pola desain Pabrik!). Ora ngerti carane 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("Исключение!" + e);
             }
         }
         return sessionFactory;
     }
 }
 
Ing kelas iki, kita nggawe obyek Konfigurasi anyar, lan pass kelas sing kudu dianggep minangka entitas: Userlan Auto. Pay manungsa waé menyang configuration.getProperties()cara. Apa properti liyane sing ana? Saka ngendi asale? Properties minangka setelan hibernate sing dituduhake ing file hibernate.cfg.xml khusus. Aplikasi Hibernate pisanan sampeyan - 12Hibernate.cfg.xml diwaca kene: new Configuration().configure(); Nalika sampeyan ndeleng, ana apa-apa utamané khusus bab iku: ngandhut paramèter kanggo nyambung menyang database, uga parameter show_sql. Iki dibutuhake supaya kabeh pitakon sql sing dieksekusi dening Hibernate ditampilake ing konsol. Kanthi cara iki sampeyan bakal bisa ndeleng persis apa sing ditindakake Hibernate ing sembarang wektu tartamtu, ngilangi rasa "sihir". Sabanjure kita kuduUserDAOkelas. Praktek paling apik kanggo program liwat antarmuka - nggawe UserDAOantarmuka lan UserDAOImplimplementasine sing kapisah, nanging aku bakal ngliwati iki kanggo nyuda jumlah kode. Aja nindakake iki ing proyek nyata! Pola desain DAO (obyek akses data) minangka salah sawijining sing paling umum. Ide iki prasaja - nggawe lapisan aplikasi mung tanggung jawab kanggo ngakses data, ora liya. Njupuk data saka database, nganyari data, mbusak data - iku. Sinau luwih lengkap babagan DAO. Sampeyan bakal nggunakake obyek akses data terus-terusan ing karya sampeyan. Kelas kita bisa UserDaoapa? Ya, kaya kabeh DAO, mung bisa digunakake karo data. Temokake pangguna kanthi id, nganyari data, mbusak, entuk 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;
     }
 }
 
UserDao's cara padha karo siji liyane. Umume, kita entuk obyek Sesi (sesi sambungan database) nggunakake Pabrik Sesi kita, nggawe transaksi siji ing sesi iki, nindakake manipulasi data sing dibutuhake, nyimpen asil transaksi ing database, banjur nutup sesi kasebut. 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()metode kita. Kabeh logika bakal dipindhah menyang UserServicekelas.

 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 aplikasi sing tanggung jawab kanggo nglakokake logika bisnis. Yen program sampeyan kudu nglakokake sawetara logika bisnis, mula bisa ditindakake liwat layanan. Layanan ngemot UserDaolan nelpon metode DAO ing metode kasebut. Koyone kaya kita duplikat fungsi ing kene (napa ora mung nelpon metode saka obyek DAO?), Nanging kanthi akeh obyek lan logika sing kompleks, lapisan aplikasi menehi kaluwihan gedhe (nglakoni iku praktik sing apik - elinga iki ing mangsa ngarep. lan maca babagan "lapisan aplikasi"). Layanan kita nduweni logika sing prasaja, nanging cara layanan ing proyek nyata ngemot luwih saka siji baris kode :) Saiki kita duwe kabeh sing dibutuhake kanggo mbukak aplikasi kasebut! Ing main()cara, ayo nggawe pangguna lan mobil, nggandhengake siji 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 ("Jenny", 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 rekaman dhewe, lan tabel autos duwe rekaman dhewe. Aplikasi Hibernate pisanan sampeyan - 13Aplikasi Hibernate pisanan sampeyan - 14Ayo coba ganti jeneng pangguna. Mbusak tabel pangguna 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 ("Jenny", 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 ("Benny");
         userService.updateUser(user);
     }
 }
 
 
Kerjane! Aplikasi Hibernate pisanan sampeyan - 15Apa yen sampeyan mbusak pangguna? 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 ("Jenny", 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 ("Benny");
         userService.updateUser(user);
         userService.deleteUser(user);
     }
 }
 
 
Lan tabel kita kosong (nggatekake konsol - kabeh panjaluk sing ditindakake dening Hibernate bakal ditampilake ing kana). Sampeyan bisa muter-muter karo aplikasi lan nyoba kabeh fungsi. Contone, nggawe pangguna nganggo mobil, simpen ing database, deleng id sing ditugasake kanggo pangguna, lan coba gunakake id iki ingmain()cara kanggo njupuk pangguna saka database lan nampilake dhaptar mobil ing console. Mesthi wae, kita mung ndeleng bagean cilik saka fungsi Hibernate. Kapabilitas kasebut jembar banget, lan wis suwe dadi alat industri standar kanggo pangembangan Jawa. Yen sampeyan pengin sinau kanthi rinci, aku bisa menehi rekomendasi buku "Java Persistence API and Hibernate". Aku nliti ing artikel sadurunge. Muga-muga artikel iki bisa migunani kanggo para pamaca. Yen sampeyan duwe pitakon, takon ing komentar. Aku bakal seneng njawab :) Uga, aja lali ndhukung penulis ing kontes kanthi ngirim "Like". Utawa luwih apik - "Tresna" :) Good luck ing pasinaon!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION