Pengenalan ORM Hibernate dalam Lucee: entityNew, entityLoad dan entitySave
Belajar ORM Lucee dengan Hibernate: tetapan ormEnabled dan ormSettings, komponen entiti, entityNew, entityLoad, entitySave, hubungan dan perangkap prestasi.

Kandungan
- Pengenalan ORM Hibernate dalam Lucee: entityNew, entityLoad dan entitySave
- Apa Itu ORM dan Bila Patut Digunakan
- ORM Lucee Dibina Atas Hibernate
- Mendayakan ORM: this.ormEnabled dan this.ormSettings
- Komponen Entiti (Persistent CFC)
- entityNew dan entitySave: Mencipta Rekod
- entityLoad dan entityLoadByPK: Membaca Rekod
- Mengemas Kini dan Memadam dengan Dirty Checking
- Hubungan Satu-ke-Banyak
- Perbandingan ORM dan Pertanyaan SQL Biasa
- Perangkap Prestasi
- Soalan Lazim (FAQ)
- Sumber
Pengenalan ORM Hibernate dalam Lucee: entityNew, entityLoad dan entitySave
ORM (Object-Relational Mapping) dalam Lucee membolehkan anda bekerja dengan rekod pangkalan data sebagai objek CFC tanpa menulis SQL mentah untuk operasi asas. Lucee membina ORM di atas Hibernate, dan anda menghidupkannya dengan this.ormEnabled serta this.ormSettings dalam Application.cfc. Fungsi teras seperti entityNew, entityLoad dan entitySave kemudian mengambil alih kerja CRUD biasa supaya anda boleh fokus pada logik aplikasi.
Apa Itu ORM dan Bila Patut Digunakan
ORM memetakan jadual pangkalan data kepada komponen CFML yang dipanggil entiti. Setiap baris dalam jadual menjadi objek, dan setiap lajur menjadi property. Kelebihannya ialah kod CRUD berulang dikurangkan, kod lebih mudah dibaca dan dijaga, dan hubungan antara jadual boleh diuruskan sebagai objek dan koleksi dan bukannya JOIN manual.
ORM paling sesuai untuk aplikasi yang banyak bergantung pada CRUD dan hubungan data, seperti sistem e-dagang atau pengurusan kandungan. Untuk pertanyaan analitik yang kompleks atau laporan besar, SQL biasa melalui cfquery selalunya lebih jelas dan lebih pantas. Anda boleh membaca panduan cfquery dan cfqueryparam untuk asas pertanyaan SQL dalam CFML.
ORM Lucee Dibina Atas Hibernate
Di bawah hud, Lucee menggunakan Hibernate, salah satu rangka kerja ORM Java yang paling meluas digunakan. Lucee menyembunyikan kerumitan konfigurasi Hibernate supaya anda tidak perlu menulis fail pemetaan XML atau kelas Java secara manual. Anda hanya mentakrifkan entiti sebagai CFC, dan Lucee mengendalikan pemetaan serta sesi di belakang tabir.
Mendayakan ORM: this.ormEnabled dan this.ormSettings
ORM dihidupkan dalam Application.cfc. this.ormEnabled ditetapkan terus pada this, bukan di dalam this.ormSettings:
component {
this.name = "my-orm-app";
this.datasource = "myDatasource";
this.ormEnabled = true;
this.ormSettings = {
dbcreate: "update",
cfclocation: [ getDirectoryFromPath(getCurrentTemplatePath()) ]
};
}
Tiga tetapan penting ialah ormEnabled yang menghidupkan ORM, dbcreate yang memberitahu Hibernate cara mengurus skema, dan cfclocation yang menentukan tempat mengimbas CFC berterusan. Nilai dbcreate yang biasa ialah update untuk prototaip, none untuk pengeluaran (iaitu lalai, jadual mesti wujud), dan dropcreate untuk pembangunan kerana ia membuang semua jadual dan menciptanya semula pada setiap permulaan aplikasi. Jika cfclocation tidak dinyatakan, Lucee mengimbas seluruh akar aplikasi, yang melambatkan permulaan pada kod besar. Jika this.ormSettings tidak menyatakan datasource, ORM menggunakan this.datasource aplikasi, dan untuk pembangunan anda juga boleh menetapkan datasource H2 dalam ingatan secara terus di dalam Application.cfc tanpa pelayan pangkalan data yang berasingan. Untuk asas konfigurasi Application.cfc, rujuk memahami application.cfc.
Komponen Entiti (Persistent CFC)
Entiti ialah CFC dengan persistent="true", dan setiap property memeta kepada lajur pangkalan data:
// User.cfc
component persistent="true" table="users" accessors="true" {
property name="id" fieldtype="id" generator="native" ormtype="integer";
property name="name" ormtype="string" length="150";
property name="email" ormtype="string" length="255";
}
Atribut persistent="true" menandakan CFC sebagai entiti, table menetapkan nama jadual, dan accessors="true" menjana kaedah getter dan setter secara automatik. fieldtype="id" menandakan kunci utama, generator="native" membenarkan pangkalan data menjana id, dan ormtype menentukan jenis data Hibernate. Untuk asas membina komponen, baca panduan fungsi dan komponen CFC.
entityNew dan entitySave: Mencipta Rekod
Gunakan entityNew untuk mencipta entiti dan entitySave untuk menyimpannya:
user = entityNew("User");
user.setName("Thalhah");
user.setEmail("admin@example.com");
entitySave(user);
Anda juga boleh menghantar struct nilai sekaligus kepada entityNew. Perkara penting untuk difahami ialah entitySave tidak menulis terus ke pangkalan data. Ia menandakan entiti sebagai belum selesai dalam sesi ORM, dan SQL sebenar dilaksanakan apabila sesi disiram, sama ada pada tamat permintaan (jika flushAtRequestEnd aktif, iaitu lalai), pada commit transaksi, atau apabila anda memanggil ORMFlush secara jelas. Untuk kod sebenar, balut operasi dalam blok transaction supaya kegagalan pada pertengahan proses boleh digulung semula dengan selamat.
entityLoad dan entityLoadByPK: Membaca Rekod
// Mengikut kunci utama
user = entityLoadByPK("User", 1);
// Mengikut kriteria struct, memulangkan array
results = entityLoad("User", { name: "Thalhah" });
// Semua entiti
allUsers = entityLoad("User");
entityLoadByPK memulangkan satu entiti atau null jika tidak ditemui, manakala entityLoad dengan struct penapis sentiasa memulangkan array. Untuk pertanyaan lanjutan, Lucee turut menyokong HQL serta pilihan seperti offset dan maxResults untuk pagination.
Mengemas Kini dan Memadam dengan Dirty Checking
Setelah entiti dimuatkan, Hibernate mengesan perubahan secara automatik melalui dirty checking, jadi anda tidak perlu memanggil entitySave semula:
user = entityLoadByPK("User", 1);
user.setEmail("baru@example.com");
// Tiada entitySave diperlukan, Hibernate mengesan perubahan
Untuk memadam, gunakan entityDelete. Seperti entitySave, DELETE sebenar berlaku semasa flush. Ini berkuasa tetapi boleh mengejutkan: jika anda mengubah entiti untuk tujuan paparan tanpa berniat menyimpan, perubahan tetap disimpan. Oleh itu, tetapkan flushAtRequestEnd kepada false dalam pengeluaran dan balut operasi dalam transaksi supaya kegagalan boleh digulung semula.
Hubungan Satu-ke-Banyak
Satu pengguna boleh mempunyai banyak artikel. Pada bahagian "satu", takrifkan koleksi seperti berikut:
// User.cfc
component persistent="true" accessors="true" {
property name="id" fieldtype="id" ormtype="string";
property name="name" ormtype="string";
property name="articles"
fieldtype="one-to-many"
cfc="Article"
fkcolumn="userId"
type="array"
cascade="all-delete-orphan";
}
Atribut cfc menetapkan entiti sasaran, fkcolumn ialah lajur kunci asing dalam jadual anak, dan type menentukan sama ada koleksi ialah array atau struct. inverse="true" bermakna bahagian many-to-one yang memiliki hubungan itu. Dengan tetapan ini, anda boleh mengakses artikel pengguna sebagai koleksi objek secara terus.
Perbandingan ORM dan Pertanyaan SQL Biasa
Jadual berikut membandingkan dua pendekatan bekerja dengan pangkalan data:
| Aspek | ORM | cfquery / queryExecute |
|---|---|---|
| CRUD asas | Sedikit kod, automatik | Kod SQL berulang |
| Hubungan data | Objek dan koleksi | JOIN manual |
| Pertanyaan kompleks | HQL, lebih terhad | SQL penuh, lebih fleksibel |
| Prestasi | Overhead kecil | Lebih langsung |
| Keluk pembelajaran | Perlu faham sesi ORM | Terus kepada SQL |
Pilih ORM untuk CRUD dan hubungan, dan SQL biasa untuk laporan atau pertanyaan analitik yang kompleks. Kedua-dua pendekatan boleh wujud bersama dalam aplikasi yang sama tanpa masalah.
Perangkap Prestasi
- flushAtRequestEnd yang aktif secara lalai boleh menyimpan perubahan secara senyap pada tamat permintaan. Matikannya dalam pengeluaran dan guna transaksi yang jelas.
- cfclocation yang merangkumi seluruh akar aplikasi melambatkan permulaan pada kod besar, jadi hadkan kepada direktori model.
- Memuatkan hubungan secara malas (lazy) tanpa kesedaran boleh menyebabkan masalah N+1 query apabila anda menggelung koleksi.
- Memuatkan koleksi besar ke dalam ingatan apabila anda hanya memerlukan beberapa rekod, guna offset dan maxResults sebaliknya.
- Tidak membalut operasi dalam transaksi, menyebabkan data tidak konsisten jika flush gagal di tengah jalan.
Untuk perbincangan lanjut tentang mengoptimumkan Lucee, rujuk panduan caching dan prestasi.
Soalan Lazim (FAQ)
Bila guna ORM berbanding cfquery?
Guna ORM untuk CRUD mudah dan hubungan data. Guna cfquery atau queryExecute untuk pertanyaan analitik kompleks atau laporan yang memerlukan kawalan SQL penuh.
Adakah ORM lebih perlahan daripada SQL mentah?
Terdapat sedikit overhead kerana lapisan pemetaan, tetapi untuk CRUD asas ia sangat cekap. Prestasi jarang menjadi isu kecuali untuk pertanyaan berat atau hubungan yang dimuatkan dengan tidak cekap.
Apakah itu entityNew dan entityLoad?
entityNew mencipta contoh entiti baharu, manakala entityLoad memuatkan entiti daripada pangkalan data. entityLoadByPK memuatkan entiti mengikut kunci utama.
Adakah entitySave menulis terus ke pangkalan data?
Tidak. entitySave menandakan entiti untuk disimpan, dan SQL sebenar dilaksanakan apabila sesi ORM disiram, sama ada pada tamat permintaan, commit transaksi, atau ORMFlush.
Apakah itu dirty checking?
Dirty checking ialah ciri Hibernate yang mengesan perubahan pada entiti yang dimuatkan dan menyimpannya secara automatik semasa flush, tanpa perlu memanggil entitySave semula.