Panduan ORM Ebean

1. Pengenalan

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

Ia menyokong anotasi JPA standard untuk menyatakan entiti. Namun, ia menyediakan API yang jauh lebih sederhana untuk bertahan. Sebenarnya, salah satu perkara yang perlu disebutkan mengenai seni bina Ebean adalah bahawa ia adalah tanpa sesi, yang bermaksud ia tidak menguruskan entiti sepenuhnya.

Selain itu, ia juga dilengkapi dengan API pertanyaan dan menyokong penulisan pertanyaan dalam SQL asli. Ebean menyokong semua penyedia pangkalan data utama seperti Oracle, Postgres, MySql, H2 dll.

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

2. Persediaan

Untuk memulakan, mari dapatkan kebergantungan kami serta beberapa konfigurasi asas.

2.1. Ketergantungan Maven

Sebelum kita mulakan, mari kita import dependensi yang diperlukan:

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

Versi terkini Ebean, H2, dan Logback boleh didapati di Maven Central.

2.2. Peningkatan

Ebean perlu mengubah biji entiti supaya ia dapat diuruskan oleh pelayan. Oleh itu, kami akan menambah pemalam Maven untuk melakukan tugas itu:

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

Kami juga perlu memberikan nama-nama pakej Maven plugin yang mengandungi entiti dan kelas yang menggunakan transaksi. Untuk melakukan itu, kami membuat fail ebean.mf:

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

2.3. Pembalakan

Mari juga buat logback.xml dan tetapkan tahap pembalakan pada beberapa pakej ke TRACE supaya kita dapat melihat pernyataan yang sedang dijalankan:

3. Mengkonfigurasi Pelayan

Kita perlu membuat contoh EbeanServer untuk menyimpan entiti atau menjalankan pertanyaan pada pangkalan data. Terdapat dua cara di mana kita dapat membuat instance pelayan - menggunakan fail sifat lalai atau melakukannya secara terprogram.

3.1. Menggunakan Fail Sifat Lalai

Fail sifat lalai boleh berbentuk sifat atau yaml . Ebean akan mencari konfigurasi dalam fail dengan nama application.properties , ebean.properties atau application.yml .

Selain memberikan butiran sambungan pangkalan data, kami juga dapat mengarahkan 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

Seterusnya, mari kita lihat bagaimana kita dapat membuat pelayan yang sama secara teratur 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. Contoh Pelayan Lalai

Satu contoh EbeanServer memetakan ke satu pangkalan data. Bergantung pada keperluan kami, kami juga dapat membuat lebih daripada satu contoh EbeanServer .

Sekiranya hanya satu contoh pelayan dibuat, secara lalai, ia didaftarkan sebagai contoh pelayan lalai. Ia boleh diakses di mana sahaja dalam aplikasi menggunakan kaedah statik di kelas Ebean :

EbeanServer server = Ebean.getDefaultServer();

Sekiranya terdapat banyak pangkalan data, ada kemungkinan untuk mendaftarkan salah satu contoh pelayan sebagai lalai:

cfg.setDefaultServer(true);

4. Membentuk Entiti

Ebean memberikan sokongan penuh untuk anotasi JPA serta ciri tambahan menggunakan anotasinya sendiri.

Mari buat beberapa entiti menggunakan anotasi JPA dan Ebean. Pertama, kami akan membuat BaseModel yang mengandungi sifat-sifat yang umum di semua entiti :

@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 JPA MappedSuperClass untuk menentukan BaseModel. Dan dua anotasi Ebean io.ebean.annotation.WhenCreated dan io.ebean.annotation.WhenModified untuk tujuan pengauditan.

Seterusnya, kami akan membuat dua entiti Pelanggan dan Alamat yang meluaskan 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 }

Dalam Pelanggan , kami telah menentukan pemetaan satu lawan satu dengan Alamat dan menambahkan jenis kaskade set ke SEMUA sehingga entiti anak juga diperbarui bersama dengan entiti induk.

5. Operasi CRUD Asas

Sebelumnya kita telah melihat bagaimana mengkonfigurasi EbeanServer dan mencipta dua entiti. Sekarang, mari kita lakukan beberapa operasi CRUD asas pada mereka.

Kami akan menggunakan contoh pelayan lalai untuk bertahan dan mengakses data. The Ebean kelas juga menyediakan kaedah statik berterusan dan data akses yang proksi permintaan untuk contoh pelayan lalai:

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 contoh pelayan lalai 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 kes seperti itu, jika kita memberi penjelasan kaedah dengan io.ebean.annotations.Transaksional, semua penyataan dalam kaedah tersebut akan dilaksanakan 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. Membina Projek

Terakhir, kita dapat membina projek Maven menggunakan perintah:

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

9. Kesimpulannya

Kesimpulannya, kami telah melihat ciri-ciri asas Ebean yang dapat digunakan untuk bertahan dan mencari entiti dalam pangkalan data hubungan.

Akhirnya, kod ini terdapat di Github.