Phát triển Java 2.0: Lưu trữ đám mây với
SimpleDB của Amazon, Phần 2
S tn ti lâu bn ca đối tượng cũ đơn gin vi SimpleJPA
Việc mô hình hóa các đối tượng miền cho hầu như bất kỳ kiểu ứng dụng nào rất dễ
dàng khi sdụng một khung công tác quan hệ như Grails, nhưng còn về SimpleDB
thì sao? Trong phn hai của bài giới thiệu về SimpleDB, Andrew Glover cho bạn
thấy cách sử dụng SimpleJPA, chứ không phi là SDK của Amazon, để duy trì các
đối tượng trong lưu trữ đám mây của SimpleDB. Ngoài việc cho phép bạn sử dụng
các đối tượng Java™ cũ đơn giản (POJO) đmô hình hóa min (theo JPA - API
tồn tại lâu bền ca Java), SimpleJPA tự động chuyn đổi các kiểu dữ liệu nguyên
thủy thành các chuỗi ký t thân thiện với Amazon. Thực ra bạn không thể đòi hỏi
một cách tiếp cn đơn giản hơn nữa để lưu trữ trên đám mây.
Trong phn đầu ca bài gii thiu v SimpleDB này, tôi đã gii thiu cho bn cách
s dng API của Amazon để mô hình hóa mt ng dng chạy đua theo phong cách
CRUD. Ngoài s duy nht hin nhiênnh cho hu hết các nhà phát trin Java v
cách tiếp cn ch theo chui ký t ca Amazon vi các kiu d liu, bn có th như
đã thy chính mình đang xem xét API ca Amazon vi mt chút hoài nghi. Cui
cùng, các API để s dng mt cơ s d liu quan h bây gi là khá chun và có
căn cứvà có l quan trng hơn là chúng đã tr nên quen thuc ri.
Ở hậu trường, hiện nay nhiều framework quan hệ trin khai các API Java
Persistence. Điều này làm cho vic mô hình hóa các đối tượng miền cho hầu hết
bất kỳ kiểu ứng dụng Java nào trnên vừa dễ dàng, vừa quen thuộc trên phạm vi
của các RDBMS. Khi bạn đã nm vững về một mô hình hóa t việc khó chấp nhận
một cách tiếp cận mi vhình hóa miền là điu hiển nhiên thôi — và tin tốt là
với SimpleDB, bạn không phải làm như vậy.
Trong phn 2 này, tôi shướng dẫn cho bạnch cấu trúc li ứng dụng chạy đua từ
Phn 1 cho phù hợp vi đặc tả JPA. Sau đó, chúng ta sẽ gửi ứng dụng tới
SimpleJPA và tìm hiểu một số cách về nền tảng nguồn m, đổi mới này có thể làm
cho thích nghi vi việc mô hình hóa miền NoSQL và lưu trữ dựa trên đám mây, trở
nên dễ dàng hơn một chút.
Hibernate và JPA: Lch s tóm tt
Nhiều nhà phát trin Java hiện nay sử dụng Hibernate (và Spring) để duy trì d
liu. Ngoài vic là một tín hiệu v sự thành công ca nguồn mở, Hibernate đã thay
đổi lĩnh vực ORM (Ánh xạ quan hệ-đối tượng) mãi mãi. Trước khi chúng ta
Hibernate, các nhà phát trin Java đã phi đối phó vi tình trạng sa lầy của các
bean thực thể của EJB (EJB entity beans); trước đó, về cơ bản chúng ta đã triển
khai các ORM riêng của mình hoặc đã mua một ORM từ một nhà cung cấp như
IBM®. Hibernate đã trút bỏ tất cả sự phức tạp đó và chi phí phải trả cho nền tảng
mô hình hóa dựa trên POJOnhiu người trong chúng ta coi là đúng hiện nay.
Người ta đã tạo ra Java Persistence API (JPA) để đáp ứng với tính phổ biến của s
đổi mới của Hibernate về sử dụng các POJO để mô hình hóa dliệu. Hin nay,
EJB 3.0 trin khai thực hiện JPA và do đó, thực hin cả Google App Engine nữa.
Ngay cbản thân Hibernate là một công cụ JPA, khi giả định bạn sử dụng
EntityManager của Hibernate.
Cứ cho là các nhà phát trin Java đã bt đầu thoải mái với việc mô hình hóa các
ứng dụng ly dữ liu là trung tâm khi sử dụngc POJO, đúng là một kho dữ liệu
như SimpleDB nên cung cấp cho chúng ta một lựa chọn tương tự. Cuối cùng chng
phải nó giống như một cơ sở dữ liu sao?
Mô hình hóa d liu với các đối tượng
Để sử dụng SimpleJPA, chúng ta cần làm một chút trên các đối tưng Racer và
Runner ca mình, đưa chúng lên ngang tầm với đặc tả JPA. May mắn thay, những
điều cơ bản của JPA khá đơn giản: bạn gắn các POJO bình thường với các chú
thích và việc thực hiện EntityManager sẽ lo nốt phần còn lại — không cn XML
nào.
JPA sử dụng hai trong số các chú tch chính là @Entity và @Id, chỉ rõ một POJO
là tn tại lâu bền và mô tkhóa nhận dạng của nó, tương ứng. Đối với mục đích
chuyển đổi ứng dụng chy đua của chúng ta sang JPA, chúng ta cũng sẽ cần sử
dụng hai chú thích để quản các mối quan hệ: @OneToMany và @ManyToOne.
Trong na đầu của bài này, tôi đã giới thiệu cho bạn cách duy trì những ngưi chạy
thi và các cuộc thi chạy. Tôi chưa bao giờ sử dụng bất k các đối tượng nào để đại
diện cho các thực thể đó, tuy nhiên — tôi ch sử dụng API thô của Amazon để duy
trì nhng đặc tính ca cả hai thực thể. Nếui muốn mô hình hóa một mối quan h
đơn giản giữa một cuộc chạy thi và những người chạy thi của nó, tôi đã có thlàm
như thế như trong Lit kê 1:
Lit kê 1. Một đối tượng Race đơn gin
public class Race {
private String name;
private String location;
private double distance;
private List<Runner> runners;
//setters and getters left out...
}
Trong Lit kê 1, tôi đã ch rõ một đối tượng Race bốn thuộc tính, thuộc tính
cuối cùng trong số đó là một Collection (bsưu tập) của các runner (người chạy