Baca semua tentang EJB 2.0

Enterprise JavaBeans 2.0, dirilis 2 Juni, bukan hanya rilis poin tetapi juga versi baru dari spesifikasi. Dengan lebih dari 500 halaman, spesifikasi EJB 2.0 lebih panjang 200 halaman (66 persen) dari spesifikasi EJB 1.1 sebelumnya. Perubahan paling penting dalam spesifikasi adalah perubahan yang dilakukan pada persistensi yang dikelola container (CMP) dan pengenalan jenis kacang yang benar-benar baru, file MessageDrivenBean.

Sebagian besar perubahan di EJB 2.0 ditemukan dalam definisi model komponen CMP baru. Ini sangat berbeda dari model CMP lama karena ini memperkenalkan peserta yang sama sekali baru, pengelola persistensi , dan cara yang benar-benar baru untuk menentukan bidang yang dikelola kontainer, serta hubungan dengan kacang lain dan objek dependen.

Pengenalan MessageDrivenBean(kacang pesan) juga penting. Kacang pesan mewakili integrasi JMS (Java Message Service) dengan EJB untuk membuat jenis kacang yang sama sekali baru yang dirancang untuk menangani pesan JMS asinkron. Jenis kacang baru yang menarik itu menyediakan model komponen untuk klien JMS, memungkinkan mereka untuk digunakan di lingkungan yang kaya dan kuat dari sistem kontainer EJB.

Ada banyak perubahan kecil lainnya yang dilakukan pada spesifikasi. Perubahan lain tersebut, meskipun penting, sebagian besar berkaitan dengan pengetatan spesifikasi untuk menghilangkan ambiguitas dan membuat komponen lebih portabel. Artikel ini berfokus pada CMP baru dan model komponen pesan kacang yang diperkenalkan di EJB 2.0.

Saya memberikan beberapa contoh konkret, jadi seharusnya cukup mudah diikuti dan dipahami. Namun, pemula EJB mungkin merasa materi tersebut lebih sulit karena diasumsikan bahwa pembaca memiliki pemahaman dasar tentang EJB. Untuk informasi lebih lanjut tentang EJB, silakan lihat Sumberdaya.

Persistensi yang dikelola penampung

Persistensi yang dikelola penampung telah mengalami perubahan radikal di EJB 2.0. Di EJB 2.0, pengelola persistensi menangani persistensi biji entitas CMP secara otomatis saat runtime. Manajer persistensi bertanggung jawab untuk memetakan kacang entitas ke database berdasarkan kontrak manajer persistensi kacang baru yang disebut skema persistensi abstrak . Selain itu, pengelola persistensi bertanggung jawab untuk mengimplementasikan dan menjalankan metode pencarian berdasarkan bahasa kueri baru yang disebut EJB QL .

Penting untuk diperhatikan bahwa produk yang memenuhi spesifikasi EJB 2.0 harus mendukung model CMP EJB 1.1 serta model EJB 2.0 yang baru. Meskipun model tersebut tidak kompatibel, diperlukan dukungan untuk model EJB 1.1 untuk memastikan kompatibilitas ke belakang.

Skema persistensi abstrak

Untuk memahami cara kerja skema persistensi abstrak dan mengapa hal itu penting, saya akan segera meninjau untuk Anda bagaimana CMP ditangani di EJB 1.1, dan kemudian membahas bagaimana skema itu didefinisikan di EJB 2.0.

Model EJB 1.1 CMP

Dalam EJB 1.1, pengembang kacang bertanggung jawab untuk mendeklarasikan bidang persisten kelas kacang sebagai tipe primitif atau serializable Java. Contoh berikut menunjukkan Employeekelas kacang perusahaan, seperti yang didefinisikan di EJB 1.1, dengan beberapa bidang CMP:

// kelas kacang karyawan kelas publik EmployeeBean mengimplementasikan java.ejb.EntityBean {// kolom instance EntityContext ejbContext; // bidang yang dikelola wadah identitas int publik; public String firstName; public String lastName; gaji ganda publik; alamat alamat publik; public Integer ejbCreate (int id, String fname, String lname) {identity = id; firstName = fname; lastName = lname; kembali nol; } ...} // Kelas kelas publik yang bergantung pada Address Address mengimplementasikan Serializable {public String street; kota String publik; negara String publik; zip string publik; }

Ketika database relasional digunakan untuk ketekunan, bidang primitif seperti identity, firstName, lastName, dan salarycukup mudah untuk bertahan karena mereka memetakan dengan baik untuk jenis SQL seperti INTEGER, CHAR, dan DOUBLE.

Dalam EJB 1.1, pendeskripsi penyebaran XML dari kacang CMP menyediakan cmp-fieldelemen untuk mengidentifikasi bidang persisten (bidang yang dikelola kontainer) di kelas kacang. Seperti yang ditunjukkan di bawah ini, cmp-fieldelemen digunakan untuk membedakan antara bidang yang ditulis ke database dan yang tidak. Misalnya, ejbContextbidang tidak disertakan dalam daftar bidang yang dikelola penampung dan oleh karena itu bukan bidang persisten.

   EmployeeEJB ... Container ... identitas firstName lastName alamat gaji ... 

Penyedia kontainer menyediakan alat untuk memetakan bidang persisten kacang ke kolom dalam tabel database, biasanya satu tabel per biji. Jenis yang dapat berseri seperti Address, bagaimanapun, lebih sulit untuk dipertahankan. Dalam EJB 1.1 tidak ada cara standar untuk memetakan objek serializable ke database relasional. Meskipun Addresskelas memiliki kumpulan kolomnya sendiri, deskriptor penerapan XML tidak menyediakan mekanisme untuk memetakan kolom tersebut ke database. Dalam kebanyakan kasus, diharapkan bahwa objek yang dapat bersambung seperti Addressakan dipertahankan sebagai tipe biner, yang kadang-kadang disebut blobtipe, ke tabel database.

Masalah itu diperburuk karena skema data kacang entitas tumbuh dalam kompleksitas. Sebuah Employeekacang, misalnya, mungkin memiliki banyak anak benda mirip Address, seperti Benefitsdan JobPosition. Objek anak tersebut, yang disebut objek dependen, dapat membentuk grafik objek kompleks yang mencakup beberapa tabel dalam database relasional. Selain itu, CMP di EJB 1.1 sebagian besar tidak memadai untuk mempertahankan hubungan dengan biji lain. Dalam EJB 1.1, jika sebuah kacang akan memelihara hubungan dengan kacang lain, wadah secara otomatis akan menggunakan kunci utama atau pegangan sebagai penghubung. Itu telah terbukti menjadi mekanisme yang cukup kasar untuk memelihara hubungan dengan biji lain yang hubungan alaminya mungkin dua arah atau bergantung pada bidang yang tidak mudah diwakili oleh kunci utama atau pegangan.

Model EJB 2.0 CMP

Dalam EJB 2.0, kontrak baru antara kacang entitas CMP dan manajer ketekunan memungkinkan Anda mendefinisikan hubungan kacang-ke-kacang yang lebih kompleks dan portabel, kacang-ke-bergantung, dan bahkan hubungan objek bergantung-ke-bergantung dalam kacang entitas.

Manajer persisten adalah peserta baru dalam proses penerapan JavaBeans Enterprise. Vendor wadah atau vendor yang mengkhususkan diri dalam persistensi ke database tertentu dapat menyediakan manajer persistensi. Idenya adalah untuk memisahkan mekanisme yang digunakan untuk mengelola hubungan kacang dari wadah, yang bertanggung jawab untuk mengelola keamanan, transaksi, dan sumber daya. Pemisahan tanggung jawab memungkinkan manajer ketekunan yang berbeda untuk bekerja dengan wadah yang berbeda. Ini juga memungkinkan kacang entitas menjadi lebih portabel di seluruh vendor EJB serta manajer persistensi.

If you have worked with or studied CocoBase, a product from Thought Inc. that automatically generates BMP (Bean Managed Persistence) beans for EJB 1.1 containers, then you are already somewhat familiar with how a persistent manager tool might work. CocoBase generates all the database access logic for BMP beans based on object-to-relational mapping information provided by the bean deployer. In EJB 2.0, the persistence manager can generate a mapping of CMP entities to a relational database based on information provided by the deployment descriptor, the bean's abstract persistence schema, and work performed by the deployer. The persistence manager is not, however, limited to a relational database. Persistence managers may also be developed for object databases as well as legacy and ERP systems such as SAP.

In order for the persistence manager to be separated from the container, a contract between the bean and the persistence manager had to be defined. The contract is manifested in the new abstract persistence schema. That schema is defined through a new set of XML elements in the deployment descriptor and a set of code idioms in the CMP entity beans. In EJB 2.0, the CMP bean class is declared as abstract and its persistent and relationship fields are accessed using abstract accessor and mutator methods whose method signatures map to special elements in the XML deployment descriptor.

When the bean is deployed, you will use persistent manager tools to generate a concrete implementation of the abstract bean class and its dependent object classes based on the XML deployment descriptor and the bean class. The concrete implementations will include the data access code that will actually read and write the bean's state to the database at runtime. At runtime, the container uses the subclasses generated by the persistence manager tools instead of the abstract classes defined by the bean provider.

To give some meat to the discussion, a CMP entity example is provided that explains more concretely how the abstract persistence schema works.

An example CMP entity in EJB 2.0

In EJB 2.0 a container-managed entity bean is defined to be abstract and its persistent fields are not defined directly in the bean class. Instead, an abstract persistent schema has been developed that lets the bean provider declare the persistent fields and bean relationships indirectly. Below is an example of the Employee bean that uses the new abstract persistent schema. Notice that none of the persistent fields are declared in the bean class.

public abstract EmployeeBean implements javax.ejb.EntityBean { . // instance fields EntityContext ejbContext; // container-managed persistent fields public abstract void setIdentity(int identity); public abstract int getIdentity(); public abstract void setFirstName(String firstName); public abstract String getFirstName(); public abstract void setLastName(String lastName); public abstract String getLastName(); // container-managed relationship fields public abstract void setContactInfo(ContactInfo info); public abstract ContactInfo getContactInfo(); ... } 

In the XML deployment descriptor of that bean, the abstract persistence schema declares the container-managed fields and relationships.

   EmployeeEJB ... Container ... identity firstName lastName ... ContactInfo ContactInfo jalan kota negara bagian zip rumahPhone kerjaPhone email ... Employee-ContactInfo employee-has-contactinfo one EmployeeEJB contactInfo ContactInfo contactinfo_belongsto_employee one ContactInfo