Tutorial Pasukan Lucee MY

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.

Pengenalan ORM Hibernate dalam Lucee: entityNew, entityLoad dan entitySave
0
Kandungan

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:

AspekORMcfquery / queryExecute
CRUD asasSedikit kod, automatikKod SQL berulang
Hubungan dataObjek dan koleksiJOIN manual
Pertanyaan kompleksHQL, lebih terhadSQL penuh, lebih fleksibel
PrestasiOverhead kecilLebih langsung
Keluk pembelajaranPerlu faham sesi ORMTerus 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

  1. flushAtRequestEnd yang aktif secara lalai boleh menyimpan perubahan secara senyap pada tamat permintaan. Matikannya dalam pengeluaran dan guna transaksi yang jelas.
  2. cfclocation yang merangkumi seluruh akar aplikasi melambatkan permulaan pada kod besar, jadi hadkan kepada direktori model.
  3. Memuatkan hubungan secara malas (lazy) tanpa kesedaran boleh menyebabkan masalah N+1 query apabila anda menggelung koleksi.
  4. Memuatkan koleksi besar ke dalam ingatan apabila anda hanya memerlukan beberapa rekod, guna offset dan maxResults sebaliknya.
  5. 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.

Sumber

0 komen

Log masuk untuk menjawab atau memberi komen.

Log masuk