Panduan untuk Ebean ORM

1. Perkenalan

Ebean adalah alat pemetaan objek-relasional yang ditulis di Jawa.

Ini mendukung anotasi JPA standar untuk mendeklarasikan entitas. Namun, ini menyediakan API yang jauh lebih sederhana untuk bertahan. Faktanya, salah satu poin yang perlu disebutkan tentang arsitektur Ebean adalah ia tanpa sesi, yang berarti ia tidak sepenuhnya mengelola entitas.

Selain itu, ia juga dilengkapi dengan API kueri dan mendukung penulisan kueri dalam SQL asli. Ebean mendukung semua penyedia database utama seperti Oracle, Postgres, MySql, H2 dll.

Dalam tutorial ini, kita akan melihat bagaimana kita dapat membuat, mempertahankan dan meminta entitas menggunakan Ebean dan H2.

2. Penyiapan

Untuk memulai, mari kita dapatkan dependensi serta beberapa konfigurasi dasar.

2.1. Dependensi Maven

Sebelum kita mulai, mari impor dependensi yang diperlukan:

 io.ebean ebean 11.22.4   com.h2database h2 1.4.196   ch.qos.logback logback-classic 1.2.3 

Versi terbaru Ebean, H2, dan Logback dapat ditemukan di Maven Central.

2.2. Peningkatan

Ebean perlu memodifikasi kacang entitas agar dapat dikelola oleh server. Jadi, kami akan menambahkan plugin Maven untuk melakukan pekerjaan itu:

 io.ebean ebean-maven-plugin 11.11.2   main process-classes  debug=1   enhance    

Kita juga perlu menyediakan plugin Maven dengan nama paket yang berisi entitas dan kelas yang menggunakan transaksi. Untuk melakukan itu kami membuat file ebean.mf:

entity-packages: com.baeldung.ebean.model transactional-packages: com.baeldung.ebean.app

2.3. Logging

Mari juga membuat logback.xml dan mengatur level logging pada beberapa paket ke TRACE sehingga kita dapat melihat pernyataan yang sedang dieksekusi:

3. Konfigurasi Server

Kita perlu membuat instance EbeanServer untuk menyimpan entitas atau menjalankan kueri di database. Ada dua cara untuk membuat instance server - menggunakan file properti default atau melakukannya secara terprogram.

3.1. Menggunakan File Properti Default

File properti default dapat berupa properti tipe atau yaml . Ebean akan mencari konfigurasi dalam file dengan nama application.properties , ebean.properties , atau application.yml .

Selain menyediakan detail koneksi database, kami juga dapat menginstruksikan Ebean untuk membuat dan menjalankan pernyataan DDL.

Sekarang, mari kita lihat contoh konfigurasi:

ebean.db.ddl.generate=true ebean.db.ddl.run=true datasource.db.username=sa datasource.db.password= datasource.db.databaseUrl=jdbc:h2:mem:customer datasource.db.databaseDriver=org.h2.Driver

3.2. Menggunakan ServerConfig

Selanjutnya, mari kita lihat bagaimana kita dapat membuat server yang sama secara terprogram menggunakan EbeanServerFactory dan ServerConfig :

ServerConfig cfg = new ServerConfig(); Properties properties = new Properties(); properties.put("ebean.db.ddl.generate", "true"); properties.put("ebean.db.ddl.run", "true"); properties.put("datasource.db.username", "sa"); properties.put("datasource.db.password", ""); properties.put("datasource.db.databaseUrl","jdbc:h2:mem:app2"; properties.put("datasource.db.databaseDriver", "org.h2.Driver"); cfg.loadFromProperties(properties); EbeanServer server = EbeanServerFactory.create(cfg);

3.3. Instance Server Default

Instans EbeanServer tunggal memetakan ke satu database. Bergantung pada persyaratan kami, kami juga dapat membuat lebih dari satu instance EbeanServer .

Jika hanya satu instance server yang dibuat, secara default, itu terdaftar sebagai instance server default. Itu dapat diakses di mana saja dalam aplikasi menggunakan metode statis pada kelas Ebean :

EbeanServer server = Ebean.getDefaultServer();

Jika ada beberapa database, dimungkinkan untuk mendaftarkan salah satu instance server sebagai yang default:

cfg.setDefaultServer(true);

4. Membuat Entitas

Ebean memberikan dukungan penuh untuk anotasi JPA serta fitur tambahan menggunakan anotasinya sendiri.

Mari buat beberapa entitas menggunakan anotasi JPA dan Ebean. Pertama, kita akan membuat BaseModel yang berisi properti yang umum di seluruh entitas :

@MappedSuperclass public abstract class BaseModel { @Id protected long id; @Version protected long version; @WhenCreated protected Instant createdOn; @WhenModified protected Instant modifiedOn; // getters and setters }

Di sini, kami telah menggunakan anotasi MappedSuperClass JPA untuk mendefinisikan BaseModel. Dan dua anotasi Ebean yaitu io.ebean.annotation.WhenCreated dan io.ebean.annotation.WhenModified untuk tujuan audit.

Selanjutnya, kita akan membuat dua entitas Pelanggan dan Alamat yang memperluas BaseModel :

@Entity public class Customer extends BaseModel { public Customer(String name, Address address) { super(); this.name = name; this.address = address; } private String name; @OneToOne(cascade = CascadeType.ALL) Address address; // getters and setters } 
@Entity public class Address extends BaseModel{ public Address(String addressLine1, String addressLine2, String city) { super(); this.addressLine1 = addressLine1; this.addressLine2 = addressLine2; this.city = city; } private String addressLine1; private String addressLine2; private String city; // getters and setters }

Di Pelanggan , kami telah menetapkan pemetaan satu ke satu dengan Alamat dan menambahkan tipe kaskade set ke SEMUA sehingga entitas anak juga diperbarui bersama dengan entitas induk.

5. Operasi CRUD Dasar

Sebelumnya kita telah melihat bagaimana mengkonfigurasi EbeanServer dan membuat dua entitas. Sekarang, mari kita lakukan beberapa operasi CRUD dasar padanya.

Kami akan menggunakan instance server default untuk mempertahankan dan mengakses data. Kelas Ebean juga menyediakan metode statis untuk bertahan dan mengakses data yang mem- proxy permintaan ke instance server default:

Address a1 = new Address("5, Wide Street", null, "New York"); Customer c1 = new Customer("John Wide", a1); EbeanServer server = Ebean.getDefaultServer(); server.save(c1); c1.setName("Jane Wide"); c1.setAddress(null); server.save(c1); Customer foundC1 = Ebean.find(Customer.class, c1.getId()); Ebean.delete(foundC1);

Pertama, kami membuat objek Pelanggan dan menggunakan instance server default untuk menyimpannya menggunakan save () .

Next, we're updating the customer details and saving it again using save().

Finally, we're using the static method find() on Ebean to fetch the customer and delete it using delete().

6. Queries

Query APIs can also be used to create an object graph with filters and predicates. We can either use Ebean or EbeanServer to create and execute queries.

Let's look at a query which finds a Customer by city and returns a Customer and Address object with only some fields populated:

Customer customer = Ebean.find(Customer.class) .select("name") .fetch("address", "city") .where() .eq("city", "San Jose") .findOne();

Here, with find() we indicate that we want to find entities of type Customer. Next, we use select() to specify the properties to populate in the Customer object.

Later, we use fetch() to indicate that we want to fetch the Address object belonging to the Customer and that we want to fetch the city field.

Finally, we add a predicate and restrict the size of the result to 1.

7. Transactions

Ebean executes each statement or query in a new transaction by default.

Although this may not be an issue in some cases. There are times when we may want to execute a set of statements within a single transaction.

Dalam kasus seperti itu, jika kita menganotasi metode dengan io.ebean.annotations.Transactional, semua pernyataan dalam metode akan dieksekusi di dalam transaksi yang sama:

@Transactional public static void insertAndDeleteInsideTransaction() { Customer c1 = getCustomer(); EbeanServer server = Ebean.getDefaultServer(); server.save(c1); Customer foundC1 = server.find(Customer.class, c1.getId()); server.delete(foundC1); }

8. Membangun Proyek

Terakhir, kita dapat membangun proyek Maven menggunakan perintah:

compile io.ebean:ebean-maven-plugin:enhance

9. Kesimpulan

Singkatnya, kita telah melihat fitur dasar Ebean yang dapat digunakan untuk mempertahankan dan meminta entitas dalam database relasional.

Terakhir, kode ini tersedia di Github.