Kegigihan Java dengan JPA dan Hibernate: Tutorial Lengkap
JPA adalah singkatan API Kegigihan Java, spesifikasi standard untuk pemetaan objek Java ke jadual pangkalan data, dan Hibernate adalah salah satu pelaksanaannya yang paling popular, menyediakan keupayaan pemetaan objek-relasi (ORM) yang memudahkan operasi pangkalan data. 1. JPA mentakrifkan piawaian untuk pemetaan entiti dan operasi CRUD, yang membolehkan pemaju mengendalikan pangkalan data dengan cara yang berorientasikan objek, mengelakkan menulis sejumlah besar kod JDBC. 2. Hibernate, sebagai pelaksanaan JPA, bukan sahaja menyokong spesifikasi JPA, tetapi juga menyediakan ciri -ciri canggih seperti caching, pemuatan malas, dan pengurusan transaksi. 3. Gunakan Maven untuk menambah pemacu hibernate-core dan pangkalan data (seperti H2), dan konfigurasikan sambungan pangkalan data dan sifat hibernat dalam Src/Main/Sumber/Meta-Inf/Kegigihan.xml, seperti HBM2DDL.Auto untuk mengawal strategi penjanaan struktur jadual. 4. Tentukan hubungan pemetaan antara kelas entiti dan jadual pangkalan data melalui @Entity, @table, @id, @GeneratedValue, @column dan anotasi lain. 5. Gunakan EntityManager untuk melaksanakan operasi CRUD. Semua operasi perlu dilakukan dalam transaksi. Berterusan () menjimatkan entiti baru, menggabungkan () mengemas kini entiti yang sedia ada, mencari () pertanyaan mengikut kunci utama, keluarkan () memadam entiti. 6. Sokongan pemetaan hubungan antara entiti, seperti @onetomany dan @manytoOne untuk melaksanakan persatuan satu-ke-banyak, dan mengkonfigurasi operasi cascade melalui Cascade untuk memastikan data yang berkaitan disimpan atau dipadamkan secara serentak. 7. Amalan terbaik termasuk: tepat pada masanya mematikan EntityManager dan EntityManagerFactory untuk mengelakkan kebocoran memori, menulis semula sama () dan hashcode () kaedah, mengutamakan fetchType.lazy untuk mengelakkan masalah prestasi, menggunakan DTO dan bukannya kelas entiti untuk mendedahkan API, dan mengelakkan lazyinitializationexception. 8. Dalam Projek Boot Spring, adalah disyorkan untuk menggunakan data Spring JPA, yang secara automatik memperoleh fungsi CRUD dengan mewarisi antara muka JParepository, dan diuruskan oleh konfigurasi pengurusan musim bunga, urus niaga dan suntikan ketergantungan. 9. Anda boleh memuatkan data yang berkaitan melalui pertanyaan jpql seperti pilih u dari pengguna yang ditinggalkan sertai u.posts untuk mengelakkan pengecualian memuatkan malas. 10. Dalam perkembangan sebenar, kita harus bermula dengan fungsi kecil, secara beransur -ansur meningkatkan entiti, hubungan dan pertanyaan, dan menggabungkan amalan untuk memahami dengan mendalam penggunaan JPA dan Hibernate. Anda kini telah menguasai pengetahuan teras JPA dan Hibernate dan dapat membina aplikasi Java yang berterusan.
Kegigihan Java dengan JPA dan Hibernate adalah kombinasi untuk menguruskan data relasi dalam aplikasi Java. Sama ada anda membina aplikasi Boot Spring atau projek Java yang berdiri sendiri, memahami bagaimana untuk meneruskan data dengan berkesan adalah penting. Tutorial ini membimbing anda melalui asas -asas JPA (Java Constence API) dan Hibernate - salah satu pelaksanaannya yang paling popular - dengan contoh praktikal dan amalan terbaik.

Apa itu JPA dan mengapa menggunakan Hibernate?
JPA (API Kegigihan Java) adalah spesifikasi, bukan pelaksanaan konkrit. Ia mentakrifkan bagaimana objek Java boleh dipetakan ke jadual pangkalan data, dan bagaimana untuk melaksanakan operasi CRUD (membuat, membaca, mengemas kini, memadam) menggunakan sintaks berorientasikan objek dan bukannya SQL mentah.
Hibernate adalah rangka kerja ORM (Object-Relational Mapping) yang lengkap, terbuka yang melaksanakan spesifikasi JPA. Ia menambah ciri -ciri tambahan di luar JPA dan mengendalikan pengangkat berat menterjemahkan objek Java ke rekod pangkalan data dan sebaliknya.

✅ Mengapa menggunakannya bersama?
- Tulis kod JDBC yang kurang boilerplate
- Bekerjasama dengan objek Java dan bukannya pertanyaan SQL
- Leverage anotasi untuk pemetaan mudah
- Sokongan untuk ciri canggih seperti caching, pemuatan malas, dan urus niaga
Menyiapkan JPA dengan Hibernate
Untuk memulakan, anda memerlukan kebergantungan yang betul. Inilah cara untuk menetapkannya dalam projek Maven:

<dependencies> <geterlihat> <groupId> org.hibernate </groupId> <stifactid> Hibernate-core </artifactid> <versi> 6.4.4.final </versi> </ketergantungan> <geterlihat> <groupId> com.h2database </groupId> <ctiFactId> H2 </artifactid> <versi> 2.2.224 </versi> </ketergantungan> </dependencies>
Kami menggunakan H2 sebagai pangkalan data dalam memori untuk kesederhanaan, tetapi Hibernate menyokong MySQL, PostgreSQL, Oracle, dan banyak lagi.
Seterusnya, buat fail persistence.xml
dalam src/main/resources/META-INF/
:
<? xml version = "1.0" encoding = "utf-8"?> <Constence xmlns = "http://xmlns.jcp.org/xml/ns/persistence" version = "3.0"> <ketekunan-unit name = "my-persistence-unit"> <creatties> <property name = "javax.persistence.jdbc.driver" value = "org.h2.driver"/> <property name = "javax.persistence.jdbc.url" value = "jdbc: h2: mem: testdb"/> <property name = "javax.persistence.jdbc.user" value = "sa"/> <property name = "javax.persistence.jdbc.password" value = ""/> <property name = "hibernate.dialect" value = "org.hibernate.dialect.h2dialect"/> <property name = "hibernate.hbm2ddl.auto" value = "update"/> <property name = "hibernate.show_sql" value = "true"/> </hartanah> </ketekunan-unit> </ketekunan>
Harta Utama:
-
hibernate.hbm2ddl.auto
:update
secara automatik mencipta atau mengemas kini jadual berdasarkan kelas entiti anda. Gunakannone
,validate
, ataucreate-drop
dalam pengeluaran seperti yang diperlukan.
Membuat entiti pertama anda
Entiti adalah kelas Java yang dipetakan ke jadual pangkalan data. Gunakan anotasi JPA untuk menentukan pemetaan.
import jakarta.persistence.*; @Entity @Table (name = "pengguna") pengguna kelas awam { @Id @GeneratedValue (Strategi = GenerasiType.identity) ID panjang peribadi; @Column (nullable = false) nama rentetan peribadi; @Column (unik = benar) e -mel rentetan peribadi; // pembina pengguna awam () {} pengguna awam (nama rentetan, e -mel rentetan) { this.name = name; this.email = e -mel; } // getters dan setters public long getId () {return id; } public void setID (id panjang) {this.id = id; } rentetan awam getName () {return name; } public void setName (Nama String) {this.name = name; } public string getEmail () {return e -mel; } public void setemail (string e -mel) {this.email = email; } @Override rentetan awam toString () { kembali "Pengguna {" "id =" id ", Nama = '" Nama' \ '' ", e -mel = '" e -mel' \ '' '}'; } }
Anotasi dijelaskan:
-
@Entity
: Tandakan kelas sebagai entiti JPA. -
@Table
: Pilihan; menyesuaikan nama jadual. -
@Id
: Menentukan kunci utama. -
@GeneratedValue
: Beritahu Hibernate untuk menjana ID secara automatik. -
@Column
: Sesuaikan definisi lajur (kebolehpercayaan, keunikan, dan lain -lain).
Melaksanakan operasi CRUD
Gunakan EntityManager
untuk berinteraksi dengan konteks kegigihan.
import jakarta.persistence.entityManager; import jakarta.persistence.entityManagerFactory; import jakarta.persistence.persistence; Utama kelas awam { public static void main (string [] args) { EntityManagerFactory emf = constence.createEntityManagerFactory ("my-persistence-unit"); EntityManager EM = EMF.CreateEntityManager (); // buat em.getTransaction (). Begin (); Pengguna Pengguna = Pengguna Baru ("Alice", "Alice@example.com"); em.persist (pengguna); em.getTransaction (). komit (); // Baca Pengguna dijumpai = em.find (user.class, 1L); System.out.println ("dijumpai:" dijumpai); // kemas kini em.getTransaction (). Begin (); found.setName ("Alicia"); em.merge (dijumpai); em.getTransaction (). komit (); // Padam em.getTransaction (). Begin (); em.remove (dijumpai); em.getTransaction (). komit (); em.close (); EMF.CLOSE (); } }
? Catatan:
- Sentiasa membungkus operasi pangkalan data dalam urus niaga.
-
persist()
menjimatkan entiti baru;merge()
mengemas kini yang terpisah. -
find()
mengambil semula entiti dengan id.
Hubungan: Contoh satu-ke-banyak
Kebanyakan aplikasi dunia nyata melibatkan hubungan. Mari tambahkan entiti Post
yang dikaitkan dengan User
.
@Entity Pos Kelas Awam { @Id @GeneratedValue (Strategi = GenerasiType.identity) ID panjang peribadi; tajuk rentetan peribadi; @Manytoone @Joincolumn (name = "user_id") pengguna pengguna peribadi; // pembina, getters, setters ... }
Sekarang, User
boleh mempunyai beberapa jawatan:
@Onetomany (mappedBy = "user", cascade = cascadetype.all, orphanRemoval = true) Senarai Persendirian <Sost> Posts = New ArrayList <> ();
Apabila anda menyimpan pengguna dengan jawatan (dan Cascade diaktifkan), Hibernate menyimpan jawatan secara automatik.
Pengguna pengguna = pengguna baru ("bob", "bob@example.com"); Post Post1 = Post Baru ("Pos Pertama"); Post Post2 = Post Baru ("Pos Kedua"); pos1.setUser (pengguna); pos2.setUser (pengguna); user.getPosts (). Tambah (post1); user.getPosts (). Tambah (Post2); em.getTransaction (). Begin (); em.persist (pengguna); em.getTransaction (). komit ();
Ini mewujudkan pengguna dan kedua -dua jawatan dalam satu transaksi.
Amalan terbaik dan perangkap biasa
Berikut adalah petua utama untuk mengelakkan masalah biasa:
- Sentiasa tutup EntityManager dan EntityManagerFactory untuk mengelakkan kebocoran memori.
- Gunakan
equals()
danhashCode()
dalam entiti - terutamanya apabila menggunakan koleksi. - Elakkan fetchtype.eager secara lalai; lebih suka
FetchType.LAZY
untuk mengelakkan memuatkan data yang tidak perlu. - Jangan mendedahkan entiti secara langsung dalam API - Gunakan DTOS (objek pemindahan data) sebaliknya.
- Berhati -hati dengan
cascade = CascadeType.ALL
- ia secara tidak sengaja boleh memadam data yang berkaitan. - Inisialisasi koleksi malas di dalam transaksi (sebelum penutupan
EntityManager
), atau gunakanJOIN FETCH
dalam pertanyaan.
Contoh pertanyaan JPQL untuk mengambil pengguna dengan siaran:
String jpql = "Pilih U dari Pengguna u Kiri Sertai u.Posts Where u.id =: id"; Pengguna Pengguna = Em.CreateQuery (JPQL, User.class) .setParameter ("ID", 1L) .getSingleresult ();
Ini mengelakkan "LazyinitializationException".
Melangkah lebih jauh: Integrasi Boot Spring
Dalam projek sebenar, terutamanya dengan Spring Boot, anda tidak akan menggunakan EntityManagerFactory
secara langsung. Sebaliknya:
- Gunakan
Spring Data JPA
untuk abstraksi repositori - Anotate kelas utama anda dengan
@SpringBootApplication
- Tentukan repositori seperti:
UserRepository antara muka awam memanjangkan JParePository <user, long> { }
Spring mengendalikan selebihnya - konfigurasi, urus niaga, dan suntikan pergantungan.
Itu sahaja. Anda kini mempunyai asas yang kukuh di JPA dan Hibernate. Daripada mendefinisikan entiti dan hubungan untuk melaksanakan CRUD dan menguruskan urus niaga, anda sudah bersedia untuk membina aplikasi Java yang didorong oleh data yang mantap. Kuncinya adalah amalan - cuba menambah lebih banyak entiti, pertanyaan, dan kekangan untuk memperdalam pemahaman anda.
Pada asasnya, mulakan kecil, biarkan Hibernate melakukan kerja, dan belajar semasa anda pergi.
Atas ialah kandungan terperinci Kegigihan Java dengan JPA dan Hibernate: Tutorial Lengkap. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas











Gunakan fmt.scanf untuk membaca input diformat, sesuai untuk data berstruktur yang mudah, tetapi rentetan dipotong ketika menghadapi ruang; 2. Adalah disyorkan untuk menggunakan bufio.scanner untuk membaca garis demi baris, menyokong input berbilang baris, pengesanan EOF dan input saluran paip, dan boleh mengendalikan kesilapan pengimbasan; 3. Gunakan io.readall (os.stdin) untuk membaca semua input sekaligus, sesuai untuk memproses data blok besar atau aliran fail; 4. Sambutan utama masa nyata memerlukan perpustakaan pihak ketiga seperti golang.org/x/term, dan Bufio mencukupi untuk senario konvensional; Cadangan Praktikal: Gunakan fmt.scan untuk input mudah interaktif, gunakan bufio.scanner untuk input baris atau saluran paip, gunakan io.readall untuk data blok besar, dan sentiasa mengendalikan

Pilihan adalah kelas kontena yang diperkenalkan oleh Java 8 untuk pengendalian yang lebih selamat dari nilai -nilai yang berpotensi null, dengan tujuan terasnya adalah dengan jelas "nilai hilang" dan mengurangkan risiko nullPointerexception. 1. Buat contoh kosong menggunakan optional.empty (), optional.of (nilai) membungkus nilai non-null, dan optional.ofnullable (nilai) dengan selamat membungkus nilai null. 2. Elakkan menggabungkan ispresent () dan dapatkan () secara langsung. Anda harus memberi keutamaan untuk menggunakan Orelse () untuk memberikan nilai lalai. Orelseget () melaksanakan pengiraan kelewatan. Kaedah ini disyorkan apabila nilai lalai adalah overhead.

SQLServer sendiri tidak menyokong seni bina tanpa pelayan, tetapi platform awan menyediakan penyelesaian yang sama. 1. Kolam ServerlessSQL Azure boleh secara langsung menanyakan fail Datalake dan caj berdasarkan penggunaan sumber; 2. 3. Awsathena menyokong pertanyaan SQL standard untuk data S3, dan caj berdasarkan data yang diimbas; 4. GooglebigQuery mendekati konsep tanpa pelayan melalui FederatedQuery; 5. Sekiranya anda mesti menggunakan fungsi SQLServer, anda boleh memilih perkhidmatan tanpa pelayan AzuresqLdatabase

Adalah disyorkan untuk menggunakan kata kunci untuk memeriksa sama ada kunci wujud dalam kamus, kerana ia adalah ringkas, cekap dan sangat mudah dibaca; 2. Ia tidak disyorkan untuk menggunakan kaedah GET () untuk menentukan sama ada kunci wujud, kerana ia akan salah apabila kunci wujud tetapi nilai tidak ada; 3. Anda boleh menggunakan kaedah kekunci (), tetapi ia berlebihan, kerana secara lalai untuk memeriksa kunci; 4. Apabila anda perlu mendapatkan nilai dan kunci yang dijangkakan biasanya wujud, anda boleh menggunakan cuba-kecuali untuk menangkap pengecualian KeyError. Kaedah yang paling disyorkan ialah menggunakan kata kunci, yang selamat dan cekap, dan tidak terjejas oleh nilai tiada, yang sesuai untuk kebanyakan senario.

Installjdk, setjava_home, InstalljavaextensionPackinvscode, createoropenamaven/gradleProject, memastikanprojectstructure, anduseBuilt-inrun/debugfeatures;

Useconnectionpoolingwithhikaricptoreusedatabaseconnectionsandreduceoverhead.2.UsePreparedStatementTopreventsqlinjectionAndroveProveQueryperformance.3.fetchonLyRequiredDataByselectingsPecificColumnSandapplyFilation.4.Se

Menguasai model integrasi Springcloud adalah penting untuk membina sistem yang diedarkan moden. 1. Pendaftaran dan Penemuan Perkhidmatan: Pendaftaran dan penemuan perkhidmatan automatik direalisasikan melalui Eureka atau Springcloudkubernetes, dan pengimbangan beban dilakukan dengan reben atau loadbalancer; 2. 3. API Gateway: Gunakan Springcloudgateway untuk menyatukan entri, kawalan penghalaan dan pengurusan kebenaran, dan menyokong pengehadan dan pembalakan semasa; 4. Penjejakan pautan yang diedarkan: Menggabungkan sleuth dan zipkin untuk merealisasikan proses penuh permintaan visual.

Panggilan sistem adalah mekanisme di mana program pengguna meminta operasi istimewa melalui antara muka kernel. Aliran kerja adalah: 1. Program pengguna memanggil fungsi enkapsulasi; 2. Tetapkan nombor panggilan sistem dan parameter kepada daftar; 3. Melaksanakan arahan syscall dan jatuh ke dalam negeri kernel; 4. Melaksanakan fungsi pemprosesan yang sepadan dalam jadual semak; 5. Kembali ke keadaan pengguna selepas pelaksanaan. Anda boleh menggunakan alat Strace untuk mengesan, terus panggil fungsi SYSCall () atau periksa fail header Unitd.H untuk melihat nombor panggilan. Anda perlu ambil perhatian bahawa perbezaan antara panggilan sistem dan fungsi perpustakaan adalah sama ada mereka memasuki keadaan kernel, dan panggilan yang kerap akan menjejaskan prestasi. Anda harus mengoptimumkan dengan menggabungkan I/O, menggunakan kaedah MMAP dan Epoll, dan pemahaman panggilan sistem akan membantu anda menguasai mekanisme operasi asas Linux.
