markdown:
Trong
[phần đầu](https://www.ibm.com/developerworks/vn/library/java/2013Q1/j-javadev2-9/) của bài giới thiệu về SimpleDB này, tôi đã giới thiệu cho bạn cách
sử dụng API của Amazon để mô hình hóa một ứng dụng chạy đua theo phong cách CRUD.
Ngoài sự duy nhất hiển nhiên dành cho hầu hết các nhà phát triển Java về cách tiếp
cận chỉ theo chuỗi ký tự của Amazon với các kiểu dữ liệu, bạn có thể như đã thấy
chính mình đang xem xét API của Amazon với một chút hoài nghi. Cuối cùng, các API để
sử dụng một cơ sở dữ liệu quan hệ bây giờ là khá chuẩn và có căn cứ —
và có lẽ quan trọng hơn là chúng đã trở nên quen thuộc rồi.
Ở hậu trường, hiện nay nhiều framework quan hệ triển khai các API Java Persistence.
Điều này làm cho việc 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 trở nên vừa dễ dàng, vừa quen thuộc trên phạm vi của các RDBMS. Khi
bạn đã nắm vững về một mô hình hóa thì việc khó chấp nhận một cách tiếp cận mới về
mô hình hóa miền là điều 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 phần 2 này, tôi sẽ hướng dẫn cho bạn cách cấu trúc lại ứng dụng chạy đua từ Phần 1 cho phù hợp với đặ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 với 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: Lịch sử tóm tắt
Nhiều nhà phát triển Java hiện nay sử dụng Hibernate (và Spring) để duy trì dữ liệu. Ngoài việc là một tín hiệu về sự thành công của 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 có Hibernate, các nhà phát triển Java đã phải đối phó với 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 POJO mà nhiều 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 dữ liệu. Hiện nay, EJB 3.0
triển khai thực hiện JPA và do đó, thực hiện cả Google App Engine nữa. Ngay cả bả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 triển Java đã bắt đầu thoải mái với việc mô hình hóa các ứng dụng lấy dữ liệu là trung tâm khi sử dụng các 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 chẳng phải nó giống như một cơ sở dữ liệu sao?
## Mô hình hóa dữ liệu 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 của 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 cần XML
nào.
JPA sử dụng hai trong số các chú thích chính là
@Entity và
@Id, chỉ rõ một POJO là tồn tại lâu bền và mô tả khóa
nhận dạng của nó, tương ứng. Đối với mục đích chuyển đổi ứng dụng chạy đ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 lý các mối quan hệ:
@OneToMany và
@ManyToOne.
Trong nửa đầ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ì những đặc tính của cả hai thực thể. Nếu tôi 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ó thể làm như thế như trong Liệt kê 1:
##### Liệt kê 1. Một đối tượng Race đơn giản
public class Race { private String name; private String location; private double distance; private List<Runner> runners; //setters and getters left out... }
Trong
[Liệt kê 1](#listing1), tôi đã chỉ rõ một đối tượng
Race có bốn thuộc tính, thuộc tính cuối cùng trong số đó là
một
Collection (bộ sưu tập) của các runner (người chạy
thi). Tiếp theo, tôi có thể tạo ra một đối tượng
Runner
đơn giản (như trong Liệt kê 2) chứa từng tên (bây giờ tôi sẽ giữ nó thật đơn giản)
và SSN (Số an sinh xã hội) của mỗi người chạy thi cùng với cá thể
Race mà cô ta hay anh ta đang tham gia.
##### Liệt kê 2. Một Runner đơn giản liên quan đến một Race
public class Runner { private String name; private String ssn; private Race race; //setters and getters left out... }
Như bạn có thể thấy trong các
[Liệt kê 1](#listing1) và [2](#listing2), tôi đã mô hình hóa một cách hợp lý một mối quan hệ
nhiều-một giữa những vận động viên (runners) và một cuộc đua (race). Trong một tình
huống thực tế, có lẽ sẽ thích hợp hơn là tạo ra liên kết nhiều-nhiều (những vận động
viên thường tham gia nhiều cuộc đua), nhưng tôi sẽ giữ nó dễ dàng. Bây giờ tôi cũng
đã bỏ qua các hàm tạo, các trình đặt (setter) và các trình nhận (getter). Tôi sẽ
trình bày chúng sau.
### Các chú thích trong JPA
Lấy hai đối tượng đã sẵn sàng như vậy cho SimpleJPA không phải là vấn đề quá khó.
Trước tiên, tôi phải biểu thị ý định của mình để làm cho chúng có khả năng tồn tại
lâu bền bằng cách thêm chú thích
@Entity cho từng đối
tượng. Tôi cũng cần mô tả đúng các mối quan hệ bằng cách sử dụng chú thích
@OneToMany trong đối tượng
Race
và chú thích
@ManyToOne trong đối tượng
Runner.
Người ta gắn chú thích
@Entity vào vào mức lớp và các chú
thích mối quan hệ được gắn vào mức getter. Tất cả điều này được thể hiện trong các
Liệt kê 3 và 4:
##### Liệt kê 3. Một Race có chú thích-JPA
@Entity public class Race { private String name; private String location; private double distance; private List<Runner> runners; @OneToMany(mappedBy = "race") public List<Runner> getRunners() { return runners; } //other setters and getters left out... }
Trong
[Liệt kê 3](#listing3), tôi đã gắn phương thức
getRunners với một chú thích
@OneToMany. Tôi
cũng đã quy định rằng có thể tìm thấy mối quan hệ này bằng cách sử dụng đặc tính
race trên thực thể
Runner.
Trong Liệt kê 4, theo cách tương tự tôi sẽ chú thích phương thức
getRace trong đối tượng
Runner.
##### Liệt kê 4. Một Runner có chú thích-JPA
@Entity public class Runner { private String name; private String ssn; private Race race; @ManyToOne public Race getRace() { return race; } //other setters and getters left out... }
Hầu hết các kho dữ liệu (quan hệ hay không quan hệ) cần một số cách mô tả tính duy
nhất giữa các dữ liệu. Vì vậy, nếu tôi muốn làm cho hai đối tượng này tồn tại lâu
dài trong một kho dữ liệu, ít nhất tôi phải thêm các ID (mã định danh) cho chúng.
Trong Liệt kê 5, tôi đã thêm một thuộc tính
id của kiểu
BigInteger vào đối tượng miền
Race. Tôi cũng sẽ làm điều tương tự với
Runner.
##### Liệt kê 5. Thêm một ID cho Race
@Entity public class Race { private String name; private String location; private double distance; private List<Runner> runners; private BigInteger id; @Id public BigInteger getId() { return id; } @OneToMany(mappedBy = "race") public List<Runner> getRunners() { return runners; } //other setters and getters left out... }
Chú thích
@Id trong
[Liệt kê 5](#listing5)
không cung cấp bất kỳ thông tin nào về cách quản lý ID. Chương trình sẽ cho rằng tôi
đang làm điều đó thủ công, chứ không phải bằng cách sử dụng một
EntityManager chẳng hạn.
## Xem xét SimpleJPA
Cho đến nay, tôi đã không thực hiện bất cứ điều gì cụ thể với SimpleDB. Nói chung, có
thể chú thích các đối tượng
Race và
Runner bằng các chú thích JPA và có thể duy trì chúng trong bất kỳ kho
dữ liệu nào được một công cụ JPA hỗ trợ. Các tùy chọn gồm có Oracle, DB2, MySQL và
(như bây giờ bạn đã có thể đoán được) SimpleDB.
*SimpleJPA* là một công cụ nguồn mở của JPA cho SimpleDB của Amazon. Trong khi
nó không hỗ trợ toàn bộ đặc tả của JPA (ví dụ, bạn không thể kết nối vào các truy
vấn JPA), nó hỗ trợ một tập hợp con đủ lớn đáng để khai thác.
Một ưu điểm lớn về sử dụng SimpleJPA là nó cố gắng xử lý liên tục các vấn đề từ điển
mà tôi đã thảo luận trong
[phần đầu của bài này](https://www.ibm.com/developerworks/vn/library/java/2013Q1/j-javadev2-9/). SimpleJPA thực hiện chuyển đổi chuỗi và bất kỳ việc
đệm thêm tiếp theo nào (nếu cần) cho các đối tượng dựa trên các kiểu số. Chủ yếu,
điều này có nghĩa là bạn không cần phải thay đổi mô hình miền của mình để phản ánh
các kiểu
String. (Có một ngoại lệ cho quy tắc đó, tôi sẽ
giải thích sau đây).
Vì SimpleJPA là một công cụ JPA, nên bạn có thể dễ dàng sử dụng các đối tượng miền
tuân thủ-JPA với nó. SimpleJPA chỉ yêu cầu bạn sử dụng các ID của
String, có nghĩa là thuộc tính
id của bạn phải là một
java.lang.String. Để
làm cho mọi việc trở nên dễ dàng hơn, SimpleJPA cung cấp lớp
IdedTimestampedBase, để quản lý đặc tính ID của đối tượng miền, cũng như
các thuộc tính ngày
created (đã tạo) và
updated (đã cập nhật). (Trong lúc triển khai bên dưới một
sản phẩm, SimpleDB tạo ra một
Id duy nhất).
## Gửi ứng dụng tới SimpleJPA
Để làm cho các lớp
Race và
Runner tuân theo SimpleJPA, tôi có thể hoặc mở rộng lớp cơ sở tiện dụng
của SimpleJPA hoặc thay đổi từng thuộc tính
id của lớp từ
BigInteger sang
String.
Tôi đã chọn tùy chọn đầu tiên, như trong Liệ kê 6:
##### Liệt kê 6. Thay đổi Race để sử dụng lớp cơ sở IdedTimestampedBase của SimpleJPA
@Entity public class Race extends IdedTimestampedBase{ private String name; private String location; private double distance; private List<Runner> runners; @OneToMany(mappedBy = "race") public List<Runner> getRunners() { return runners; } //other setters and getters left out... }
Tôi sẽ không chỉ cho bạn thấy một mã tương tự cho
Runner,
nhưng cứ tự nhiên thực hiện tạo mã một mình: chỉ cần mở rộng
IdedTimestampedBase và loại bỏ đặc tính
id
khỏi
Runner.
Việc cập nhật các ID cho
Race và
Runner là bước đầu tiên làm cho ứng dụng chạy đua tuân theo SimpleJPA.
Tiếp theo, tôi cần đổi các kiểu dữ liệu nguyên thủy (như
double,
int và
float) để lấy các đối tượng như
Integer (Số
nguyên) và
BigDecimal (Số thập phân lớn).
Tôi sẽ bắt đầu với thuộc tính
distance (khoảng cách) của
Race. Tôi đã thấy
BigDecimal tin cậy hơn
Double (trong bản phát
hành hiện tại của SimpleJPA), do đó, tôi đã thay đổi đặc tính
distance của
Race thành
BigDecimal, như trong Liệt kê 7:
##### Liệt kê 7. Thay đổi khoảng cách sang BigDecimal
@Entity public class Race extends IdedTimestampedBase{ private String name; private String location; private BigDecimal distance; private List<Runner> runners; @OneToMany(mappedBy = "race") public List<Runner> getRunners() { return runners; } //other setters and getters left out... }
Bây giờ cả hai
Runner và
Race
đã sẵn sàng được duy trì thông qua một công cụ của SimpleJPA.
## Sử dụng SimpleJPA với SimpleDB
Việc thao tác với các đối tượng miền của bạn dựa vào SimpleDB với SimpleJPA không có
bất kỳ khác biệt nào so với việc thực hiện dựa vào một cơ sở dữ liệu quan hệ bình
thường với một công cụ JPA. Nếu bạn đã từng thực hiện bất kỳ việc phát triển ứng
dụng nào với JPA, thì bạn không có gì ngạc nhiên về nó cả. Điều duy nhất, có thể là
mới, là việc cấu hình
EntityManagerFactoryImpl của
SimpleJPA, để yêu cầu các thông tin về Các dịch vụ web của Amazon (Amazon Web
Services) của bạn và tên tiền tố cho tên miền SimpleDB của bạn. (Một tùy chọn khác
sẽ cung cấp một tệp các thuộc tính có chứa các thông tin của bạn trên đường dẫn lớp
(classpath)).
Khi tạo một cá thể
EntityManagerFactoryImpl của SimpleJPA,
việc sử dụng tên tiền tố của bạn sẽ dẫn đến các miền SimpleDB bắt đầu với tiền tố
của bạn tiếp theo là một dấu gạch ngang rồi đến tên đối tượng miền của bạn. Vì vậy,
nếu tôi quy định "B50" làm tiền tố của mình, thì khi tôi tạo một mục
Race trong SimpleDB, tên miền sẽ là "b50-Race".
Một khi bạn đã tạo ra một cá thể
EntityManagerFactoryImpl
của SimpleDB, giao diện này sẽ hướng dẫn mọi thứ khác. Bạn sẽ cần một cá thể
EntityManager đã thu được từ
EntityManagerFactoryImpl, như trong Liệt kê 8:
##### Liệt kê 8. Thu được một cá thể EntityManager
Map<String,String> props = new HashMap<String,String>(); props.put("accessKey","..."); props.put("secretKey",".."); EntityManagerFactoryImpl factory = new EntityManagerFactoryImpl("b50", props); EntityManager em = factory.createEntityManager();
### Thao tác các đối tượng miền
Một khi bạn gọi một cá thể
EntityManager, bạn có thể thao
tác các đối tượng miền tùy ý. Ví dụ, tôi có thể tạo ra một cá thể
Race như sau:
##### Liệt kê 9. Tạo một cá thể Race
Race race = new Race(); race.setName("Charlottesville Marathon"); race.setLocation("Charlottesville, VA"); race.setDistance(new BigDecimal(26.2)); em.persist(race);
Trong
[Liệt kê 9](#listing9), SimpleJPA xử lý tất cả các yêu cầu HTTP để
tạo ra
Race trong đám mây. Việc sử dụng SimpleJPA có
nghĩa là tôi cũng có thể lấy ra cuộc chạy thi (race) bằng cách sử dụng một truy vấn
JPA, như trong Liệt kê 10. (Hãy nhớ rằng bạn không thể kết nối với các truy vấn này,
nhưng tôi vẫn có thể tìm kiếm chúng bằng các con số).
##### Liệt kê 10. Tìm một cuộc thi chạy theo khoảng cách
Query query = em.createQuery("select o from Race o where o.distance = :dist"); query.setParameter("dist", new BigDecimal(26.2)); List<Race> races = query.getResultList(); for(Race race : races){ System.out.println(race); }
### Từ các số thành các chuỗi ký tự
Phép thuật số thành các chuỗi ký tự trong việc triển khai bên dưới của SimpleJPA đặc
biệt tốt đẹp; ví dụ, nếu bạn cho phép in truy vấn trong SimpleJPA, bạn có thể thấy
nó ban hành các truy vấn nào cho SimpleDB. Truy vấn đã gửi đi được hiển thị trong
Liệt kê 11. Lưu ý cách mã hóa
distance.
##### Liệt kê 11. SimpleJPA xử lý tốt các số!
amazonQuery: Domain=b50-Race, query=select * from `b50-Race` where `distance` = '0922337203685477583419999999999999928946'
Việc đệm thêm và mã hóa tự động làm cho mọi thứ trở nên dễ dàng hơn nhiều, bạn có nghĩ vậy không?
## Các mối quan hệ trong SimpleJPA
Mặc dù SimpleDB không cho phép các kết nối miền trong các truy vấn, bạn vẫn có thể có
các mục liên quan trên các miền. Cũng giống như tôi đã giới thiệu cho bạn trong
[Phần 1](https://www.ibm.com/developerworks/vn/library/java/2013Q1/j-javadev2-9/), bạn có thể chỉ cần lưu trữ khóa của một đối tượng có liên quan
trong đối tượng khác và sau đó lấy ra đối tượng đó khi bạn cần nó. Đó cũng là những
gì mà SimpleJPA làm. Ví dụ, ở trên tôi đã chỉ cho bạn thấy cách liên kết các
Runner tới một
Race bằng cách sử
dụng các chú thích JPA. Vì vậy, tôi có thể tạo ra một cá thể của một
Runner, thêm cá thể
race hiện có
vào nó, rồi duy trì cá thể
Runner, như trong Liệt kê 12:
##### Liệt kê 12. Các mối quan hệ với SimpleJPA
Runner runner = new Runner(); runner.setName("Mark Smith"); runner.setSsn("555-55-5555"); runner.setRace(race); race.addRunner(runner); em.persist(runner); em.persist(race); //update the race now that it has a runner
Cũng lưu ý trong
[Liệt kê 12](#listing12) rằng tôi phải cập nhật cá thể
Race để phản ánh thực tế là tôi đã thêm một cá thể
Runner vào nó (cũng lưu ý, tôi đã thêm một phương
thức
addRunner vào
Race để
thêm một
Runner vào
Collection
nội bộ của các
Runner).
Một lần nữa, nếu tôi tìm kiếm một cuộc chạy thi theo khoảng cách của nó, tôi cũng có thể nhận được một danh sách các runner (những vận động viên) trong cuộc chạy đua đó giống như Liệt kê 13:
##### Liệt kê 13. Thêm mối quan hệ
Query query = em.createQuery("select o from Race o where o.distance = :dist"); query.setParameter("dist", new BigDecimal(26.2)); List<Race> races = query.getResultList(); for(Race races : race){ System.out.println(race); List<Runner> runners = race.getRunners(); for(Runner rnr : runners){ System.out.println(rnr); } }
Việc sử dụng một cá thể
EntityManager cho phép tôi xóa các
thực thể qua phương thức
remove, như trong Liệt kê 14:
##### Liệt kê 14. Loại bỏ một cá thể lớp
Query query = em.createQuery("select o from Race o where o.distance = :dist"); query.setParameter("dist", new BigDecimal(26.2)); List<Race> races = query.getResultList(); for(Race races : race){ em.remove(race); }
Trong khi tôi đã loại bỏ một cá thể
Race trong
[Liệt kê 14](#listing14), thì vẫn không loại bỏ được bất kỳ các
Runners nào có liên quan với nó. (Tất nhiên, tôi có thể xử
lý điều này bằng cách sử dụng chú thích
EntityListeners
của JPA, có nghĩa là tôi có thể móc nối vào một sự kiện loại bỏ và sử dụng nó để
loại bỏ các cá thể
Runner).
## Kết luận
Bài viết về SimpleDB đã cho bạn thấy cách thao tác các đối tượng trong kho dữ liệu không quan hệ bằng cách sử dụng API của các dịch vụ web của Amazon (Amazon Web services) và SimpleJPA. SimpleJPA thực hiện một tập hợp con của API tồn tại lâu bền của Java (JPA - Java Persistence API) để làm cho đối tượng tồn tại lâu bền trong SimpleDB dễ dàng hơn. Một trong những tiện lợi về sử dụng SimpleJPA, như bạn đã thấy, là ở chỗ nó tự động chuyển đổi các kiểu nguyên thủy thành các đối tượng chuỗi ký tự mà SimpleDB nhận ra. SimpleJPA cũng xử lý tự động các quy tắc không kết nối của SimpleDB cho bạn, làm cho việc mô hình hóa các mối quan hệ trở nên dễ dàng hơn. Các giao diện trình nghe rộng rãi của SimpleJPA cũng giúp bạn có khả năng thực hiện các quy tắc toàn vẹn dữ liệu logic trước đây chỉ có ở thế giới quan hệ.
Điểm mấu chốt về SimpleJPA là nó có thể giúp bạn truy cập khả năng mở rộng quy mô có ý nghĩa, không tốn kém một cách nhanh chóng và dễ dàng. Với SimpleJPA, bạn có thể sử dụng kiến thức mà bạn đã tích lũy từ nhiều năm làm việc với các khung công tác như Hibernate trong một môi trường lưu trữ dựa trên đám mây, không quan hệ.
## Tài nguyên
### Học tập
[: Loạt bài trên developerWorks này khám phá các công nghệ và các công cụ đang định nghĩa lại bối cảnh phát triển Java, bao gồm](https://www.ibm.com/developerworks/vn/views/java/libraryview.jsp?search_by=Phát+triển+Java+2.0:) *Phát triển Java 2.0* [Gaelyk](http://www.ibm.com/developerworks/java/library/j-javadev2-6/index.html?S_TACT=105AGY75)(12.2009), [Google App Engine](https://www.ibm.com/developerworks/vn/library/j-javadev2-1/)(12.2009) và [CouchDB](http://www.ibm.com/developerworks/java/library/j-javadev2-5/index.html?S_TACT=105AGY75)(11.2009). [Bản trình diễn Video: Một bài giới thiệu về Amazon SimpleDB](http://www.ibm.com/developerworks/offers/lp/demos/summary/j-amazonsimpledb.html?S_TACT=105AGY75)(Andrew Glover, developerWorks): Tìm hiểu xem SimpleDB hoạt động như thế nào, hiểu các ưu điểm và nhược điểm của nó và xem cách tạo ra một bản ghi, truy vấn dữ liệu và xóa dữ liệu.
- "
[Các mẫu NoSQL](http://horicky.blogspot.com/2009/11/nosql-patterns.html)" (Ricky Ho, Pragmatic Programming Techniques, 11.2009): Một tổng quan và liệt kê về các cơ sở dữ liệu NoSQL, tiếp theo là xem xét sâu về kiến trúc chung của các kho dữ liệu NoSQL.
- "
[" (Prabhakar Chaganti, developerWorks, 02.2009): Tìm hiểu các khái niệm cơ bản về Amazon SimpleDB (SDB) và khám phá một số chức năng được cung cấp bởi boto, một thư viện Python nguồn mở để tương tác với SDB.](http://www.ibm.com/developerworks/library/ar-cloudaws5/?S_TACT=105AGY75) *Điện toán đám mây với Amazon Web Services, Phần 5: Xử lý tập dữ liệu trong đám mây với SimpleDB*
- "
[" (Prabhakar Chaganti, IBM developerWorks, 07.2008): Khám phá các dịch vụ cung cấp một sự thay thế khác hấp dẫn để kiến trúc và xây dựng các ứng dụng tin cậy, có khả năng mở rộng quy mô ra sao.](http://www.ibm.com/developerworks/library/ar-cloudaws1/?S_TACT=105AGY75) *Điện toán đám mây với Amazon Web Services, Phần 1*: Giới thiệu [" (Richard Hightower, developerWorks, 08. 2009): Rick Hightower giải thích những thiếu sót của khung công tác tồn tại lâu bền dựa trên Java hiện tại của Google App Engine và thảo luận về một số cách giải quyết.](http://www.ibm.com/developerworks/java/library/j-gaej3.html?S_TACT=105AGY75) *Google App Engine cho Java: Phần 3*: Tồn tại lâu bền và các mối quan hệ
- Duyệt
[hiệu sách công nghệ](http://www.ibm.com/developerworks/apps/SendTo?bookstore=safari&S_TACT=105AGY75)để biết các cuốn sách về các chủ đề kỹ thuật này và các chủ đề khác. [Vùng kỹ thuật Java trên developerWorks](http://www.ibm.com/developerworks/java?S_TACT=105AGY75): Tìm hàng trăm bài viết về mọi khía cạnh của lập trình Java.
### Lấy sản phẩm và công nghệ
[SimpleJPA](http://code.google.com/p/simplejpa/): Một công cụ Java Persistence API (JPA) cho SimpleDB của Amazon. Nói cách khác, một khung công tác ánh xạ quan hệ-đối tượng (ORM) cho các cơ sở dữ liệu trong đám mây của Amazon.
### Thảo luận
- Hãy tham gia vào
[cộng đồng My developerWorks](http://www.ibm.com/developerworks/mydeveloperworks/?S_TACT=105AGY75). Kết nối với những người sử dụng developerWorks khác trong khi khám phá các blog, các diễn đàn, các nhóm và các wiki theo hướng nhà phát triển.
## Bình luận
[Vùng dữ liệu trên developerWorks](http://www.ibm.com/developerworks/vn/views/data/libraryview.jsp)
Khám phá các bài viết xoay quanh lĩnh vực dữ liệu, Quản lý hệ thống thông tin
[Vùng mã nguồn mở trên developerWorks](http://www.ibm.com/developerworks/vn/views/opensource/libraryview.jsp)
Xem các bài viết về HTML, CSS, JavaScript,...
[Điện toán đám mây](http://www.ibm.com/developerworks/vn/views/cloud/libraryview.jsp)
Tìm hiểu về điện toán đám mây

Content-Language: en-US


markdown:
# Làm Việc Tại Nhà
**Bạn muốn làm công ăn lương suốt đời không? Để rồi khi về hưu ở tuổi ngoài 60, chỉ nhận phần lương hưu ít ỏi để hưởng thụ quãng đời còn lại. Bạn nghĩ rằng cuộc đời như vậy có ý nghĩa không?**
Chào mừng bạn đến hệ thống làm việc tại nhà - Work at Home (WAH), với hơn 32 năm kinh nghiệm, có mặt tại 82 quốc gia trên toàn thế giới, hệ thống WAH đã thành công trong việc giúp nhiều người đạt được ước mơ làm việc ở nhà, và bây giờ bạn chỉ cần tìm hiểu và làm theo hướng dẫn của hệ thống WAH, và dần dần bạn bạn sẽ nhận được tất cả sự hỗ trợ cần thiết, và hiện thực ước mơ của bạn trong cuộc sống.
[Đây có phải là bạn không?](#)
- Bạn nghe lời cha mẹ, học đại học tương lai sẽ có nhiều cơ hội tốt để tìm được việc làm tốt. Nay bạn đã tốt nghiệp ra trường, nhưng vẫn chưa tìm được việc làm.
- Bạn tốt nghiệp ra trường đã nhiều năm, đã thay đổi nhiều việc làm khác nhau, nhưng tiền lương không bao giờ theo kịp vật giá leo thang.
- Bạn làm việc siêng năng, nhưng ông chủ chỉ căn cứ bằng cấp, mối quan hệ để quyết định thăng cấp cho nhân viên, người thăng cấp mãi mãi không phải là bạn, trừ khi bạn cực kỳ là giỏi.
- Bạn là nội trợ gia đình đã nhiều năm, tìm việc làm thì liên tục gặp khó khăn vì hầu hết tất cả việc làm đều cần phải sử dụng máy tính, cần phải có một ít kỹ năng chuyên môn.
- Bạn còn vài năm nữa là về hưu, khi đó bạn có được ở nhà chăm sóc cây kiển, an dưỡng tuổi già không? Hay phải kiếm thêm công việc khác để làm?
- Bạn đến lúc đóng học phí cho con cái, cần vay mượn tiền người thân bạn bè, hoặc hốt hụi thì tháng này mới có thể qua được.
- Bạn có biết làm ông chủ không phải dễ, kinh tế không sáng sủa là thực sự không dễ chịu.
- Bạn tham dự nhiều buổi thuyết trình về kêu gọi đầu tư sáng nghiệp, mọi nhà kêu gọi đều nói họ có lợi nhuận cao nhất, có phải bạn thật sự thích hợp làm ông chủ?
- Bạn làm việc nhiều năm, nay ông chủ phá sản, bạn bỗng trở thành người thất nghiệp.
- Làm việc đã lâu năm, nhưng bạn vẫn không tích lỹ đủ số tiền để làm công việc mình thích như mua xe, du lịch.
- Sau nhiều năm làm việc, đổi nhiều công ty, sau cùng chỉ đổi lấy bệnh tật, mệt mỏi, không biết có xứng đáng không?
[Xem lại tình trạng hiện tại của bạn](#)
- Bạn hài lòng với công việc và thu nhập hiện giờ của bạn không?
- Bạn có chán nản với việc đi sớm về muộn không?
- Bạn phải sống với thu thấp hơn chi tiêu không?
- Bạn có phải không còn điều kiện thăng cấp, và cảm thấy tương lại vô vọng không?
- Áp lực và giao tiếp có phải đang làm cho bạn kiệt sức không?
- Bạn có phải đang nhận thấy thù lao thấp hơn giá trị bạn xứng đang phải nhận không?
- Bạn có phải luôn tìm đột phá, nhưng chưa gặp thời cơ?
- Bạn có còn nhận mức lương cũ, mãi mãi không được tăng lương?
- Hiện nay bạn có khá hớn lúc bạn 3 năm trước chưa?
- Bạn nhận thấy việc làm hiện nay của bạn có hợp lý không?
- Bạn có cảm thấy công việc hiện tại không có tương lai hoặc rất chán nản với nó không?
- Vợ/chồng của bạn có luôn than phiền lúc nào cũng không đủ tiền để có thể làm theo ý muốn không?
- Bạn bằng lòng làm những công việc hiện nay thêm 20 năm không?
- Bạn có muốn con cái của bạn khi trưởng thành cũng làm những công việc như bạn không?
- Bạn có tự hào về cộng việc hiện nay của bạn không?
- Cuộc sống hiện giờ của bạn có phải là cuộc sống bạn mong muốn không?
- Bạn có thể tạm thời không phiền não, chờ cho đến lúc tuổi già mới tính toán không?
[Cùng chung hoàn cảnh với bạn](#) **Bjorn Froman - thợ điện, nước**
Xin chào, tôi là Bjorn Froman, trước kia tôi là một thợ điện, nước và bán bánh ngọt tại Thụy Điển, qua giới thiệu từ bạn bè, tôi bắt đầu đến Đài Loan phát triển sự nghiệp, lúc bấy giờ tôi không biết tiếng Trung Hoa cũng như tiếng Anh, nhưng tôi từng bước học và làm theo hệ thống làm việc tại nhà - Work at Home (WAH), hiện nay thu nhập của tôi đã hơn 800,000 Tân Đài Tệ.
**Dương Tĩnh Hồng, Ngô Thục Mãn - giám đốc dịch vụ, giảng viên**
Vợ chồng tôi về Đài Loan sau khi đã tu nghiệp thạc sĩ từ Mỹ năm 1997, từ đó chúng tôi cần cù làm việc, vợ tôi là giảng viên tại một trường kỹ thuật, tôi thì làm việc trong lãnh vực dịch vụ điện tử và điện tín. Cho đến năm 2004, chúng tôi phát hiện ra lương của vợ chồng chúng tôi 250,000/năm, nhưng không đủ cung cấp cho con cái một hoàn cảnh trưởng thành ưu việt, làm việc hưởng lương của người ta sẽ không có điều kiện trong một thời gian ngắn mà báo đáp ơn của chà mẹ một cách đầy đủ, cũng không đủ thời gian giành cho người thân trong gia đình, làm công cho người ta, đồng nghĩa số mệng của mình bị người ta nắm lấy, không tài nào thực hiện được ước mơ cá nhân. Kể từ tháng 05 Năm 2005 chúng tôi bắt đầu tiếp xúc với hệ thống làm việc tại nhà - WAH, từ đó mỗi tháng tăng được 100,000 thu nhập, chúng tôi tin sư nghiệp thật sự của chúng tôi nay chỉ mới là bắt đầu.
**Trần Xương Tang - bộ đội xuất ngủ**
Tôi đi lính khi tôi chưa tốt nghiệp phổ thông, sau khi xuất ngũ tôi cũng không biết phải làm gì, nhưng trong lòng bao giờ cũng nghĩ đừng bao giờ đi làm công cho người ta. Mẹ tôi làm công chức đã hơn 20 năm, lương tháng mới chỉ được 50,000, tôi nghĩ nếu tôi không thay đổi, với tình hình kinh tế khó khăn hiện nay, 20-30 năm sau thu nhập của tôi có thể còn tệ hơn mẹ tôi. Tôi luôn tìm kiến cơ hội việc làm, nhưng tôi không có khẩu tài, nói chuyện không rõ rằng, tôi cho là tôi sẽ không thích hợp làm những công việc dịnh vụ. Nhưng tôi được một người lạ trên mạng giới thiệu hệ thống làm việc tại nhà WAH, tôi từng bước học tập theo hệ thống. Đến tháng thứ 4, thu nhập của tôi đã hơn 60,000. Tôi không biết tiếng Anh nhưng tôi có nguồn thu từ 2 nước, Mỹ và Đài Loan, không thể tin được hai anh em bên cạnh tôi mỗi tháng thu nhập hơn 50,000 USD!
[Quan điểm về công việc trong thời đại mới](#)
- Xí nghiệp lớn thu nhỏ, tái cơ cấu, giảm nhân viên, giảm mức lương.
- Sau khi công ty giảm nhân viên, công việc của từng nhân viên còn lại sẽ tăng, không tránh khởi phải làm thêm giờ.
- Tình hình những xí nghiệp lớn bao thầu các dịch vụ ngoài tăng cao.
- Tình trạng giao thông xấu đi, thời gian nghỉ ngơi của cá nhân bị giảm.
- Trong xã hội thông tin hiện đại, giá máy tính cá nhân, thiết bị thông tin và thiệt bị văn phòng liên tục trượt giá.
- Do nguyên do trên, phòng làm việc cá nhân đã mọc lên như một trào lưu hiện đại không thể cản được, các xí nghiệp bạn đang làm việc chỉ chú trọng lãi sau thuế, không quan tâm đến bạn phải làm thêm giờ, càng không quan tâm đến phẩm chất sinh hoạt của gia đình bạn, cũng không ai quan tâm bạn có đủ tiền để nộp học phí cho các con của bạn không, cũng như tiền góp nhà ở của bạn.
- Cuốn sách "Làm Thế Nào Để Giàu Có" do John Paul Getty viết, có đề cập: điều thứ nhất để trở thành giàu có là bạn phải kiếm tiền cho bản thân, nếu kiếm tiền cho người khác thì bạn mãi mãi không thể giàu có! Lời nói này luôn được chứng minh. Tại nước Mỹ, mỗi 10 giây là có một người gia nhập vào hàng ngũ làm viêc tại nhà, 14 năm qua, con số này từ 6 triệu người tăng đến 32 triệu người, hiện vẫn tiếp tục gia tăng, nay là một cơ hội tốt cho bạn, chỉ coi bạn muốn hay không muốn bước ra, bạn nên tự chịu trách nhiệm với tương lai của bạn.
[Hệ thống làm việc tại nhà - Work at Home (WAH)](#)
Bạn chán nản về việc làm hiện nay, nhưng không đủ dũng cảm thay đổi, cũng có thể bạn đã hài lòng với tất cả những gì bạn đang có, bạn không muốn có sự thay đổi nào hết! Vậy thì hệ thống việc tại nhà WAH - Work at Home (WAH) sẽ không giúp gì cho bạn được, bạn có thể chọn duy trì trạng thái hiện nay. Nếu không phải, xin mời bạn đọc tiếp.
Hệ thống WAH sẽ hướng dẫn bạn bước đi từng bước để bắt đầu sự nghiệp cá nhân của bạn.
**Các Đặc Điểm Chính Của Mô Hình Work at Home** **WAH mang lại cho bạn cơ hội kinh doanh ít rủi ro. Trường hợp xấu nhất xảy ra và bạn không tham gia WAH nữa bạn vẫn có thể thu hồi vốn đầu tư.** **Mô hình kinh doanh rất ít rủi ro** **Tự làm chủ trong kinh doanh**
Mô hình WAH giúp bạn có thể tự làm chủ trong kinh doanh mô hình
**Bán Hàng Trực Tiếp (Direct Selling)**, chính bạn là ông chủ, bạn không phải làm công ăn lương. Bạn không phải quan tâm đến các vấn đề giấy phép, kế toán, thuế vụ... vì hệ thống WAH đã lo cho bạn từ A-Z. **Làm việc mọi lúc, mọi nơi**
Mô hình WAH không đòi hỏi bạn phải có vốn nhiều, không đòi hỏi kinh nghiệm, kỹ năng đặc biệt nào. Bạn có thể làm việc bất cứ lúc nào, tại nhà, trên bãi biển... hoặc bất kỳ nơi nào bạn thích.
**Lĩnh vực chăm sóc sức khỏe**
WAH hoạt động trên lĩnh vực chăm sóc sức khỏe con người, một lĩnh vực mà tất cả mọi người đều cần. Sản phẩm của WAH được nghiên cứu bởi các tiến sĩ khoa học hàng đầu thế giới, đã phát triển hơn 32 năm và làm hài lòng hơn 100 triệu khách hàng trên toàn thế giới.
**Hệ thống vi tính công nghệ thông tin**
Bạn được cung cấp các hệ thống công nghệ thông tin để hỗ trợ làm việc. Bạn luôn tìm được sự giúp đỡ, hướng dẫn tận tình của các thành viên trong hệ thống.
**Xây dựng hệ thống kinh doanh của riêng bạn**WAH giúp bạn xây dựng một hệ thống kinh doanh (đội nhóm kinh doanh) của riêng bạn, hệ thống của bạn rộng lớn bao nhiêu thì thu nhập của bạn càng nhiều bấy nhiêu. **Mô hình kinh doanh toàn cầu**Hệ thống WAH hoạt động trên toàn cầu, do đó bạn có địa bàn hoạt động rộng lớn trên toàn cầu chứ không chỉ trong nước. Bạn có thể hoạt động ở Việt Nam như có nguồn thu nhập từ toàn cầu. **Mô hình có tính kế thừa**Khi bạn đã xây dựng được sự nghiệp ổn định cho mình trong hệ thống WAH, và khi về hưu, con cháu bạn có thể kế thừa hệ thống này mà không cần phải gầy dựng lại từ đầu. **Thu nhập thụ động**Khi bạn đã xây dựng được hệ thống kinh doanh, thì lúc đó bạn không cần phải làm việc nhưng vẫn có thu nhập từ hệ thống kinh doanh của bạn. **Tham gia hoạt động từ thiện**Khi bạn tham gia WAH, tức là bạn đang tham gia hoạt động từ thiện. Mỗi sản phẩm mà bạn hoặc hệ thống của bạn kinh doanh đều góp một phần nho nhỏ vào quỹ từ thiện.
Làm việc trong hệ thống WAH, bạn sẽ có được
**sức khỏe tốt** và **tài chính ổn định**, giúp bạn thực hiện những ước mơ của bạn, giúp bạn sơ hữu được tất cả bạn xứng đáng sở hữu chỉ qua 2 công việc chính: **Giúp đỡ mọi người có được sức khỏe tốt:**bằng việc cung cấp (kinh doanh) các sản phẩm dinh dưỡng chất lượng cao và thay đổi lối sống của khách hàng, giúp khách hàng ý thức hơn về việc chăm sóc sức khỏe chủ động. Hệ thống WAH sẽ bảo đảm 100% khách hàng sẽ hài lòng với sức khỏe của mình sau khi thực hiện các giải pháp dinh dưỡng, nếu không khách hàng sẽ được hoàn lại 100% chi phí. **Pháp triển chi nhánh kinh doanh rộng lớn:**đào tạo và phát triển chi nhánh trên khắp cả nước và quốc tế, để nhiều người hơn có được sức khỏe tốt và sự nghiệp ổn định.
[Số liệu khảo sát hệ thống WAH](#)
Dưới đây là số liệu khảo sát trên qui mô lớn về những người tiếp nhận việc trợ giúp của hệ thống làm việc tại nhà - Work at Home (WAH) trên toàn thế giới:
- 88% thành viên WAH cho là cách làm việc hiện nay vui hơn trước.
- 82% thành viên muốn giới thiệu người khác gia nhập hệ thống WAH, làm việc tại nhà.
- 83% thành viên nhận thấy vẫn muốn tiếp tục làm việc tại nhà trong 5 năm tới nữa.
- 20% thành viên có thu nhập trong năm đạt trên 3 triệu USD.
- 14% thành viên có thu nhập trong năm đạt từ 1.5 đến 3 triệu USD.
- 30% thành viên làm việc cùng các thành viên khác trong gia đình tại nhà.
- 60% thành viên nhận thấy tình trạng kinh tế hiện nay tốt hơn dự kiến ban đầu.
- 73% thành viên dự kiến thu nhập trong năm nay sẽ tăng trưởng vượt dự kiến.
[Bạn có phải là người chúng tôi muốn tìm không?](#)
- Có đúng là bạn là người chúng tôi đang tìm không?
- Rất vui khi bạn có thể từng bước từng bước đi đến đây.
- Chúng tôi hy vọng bạn đã trang bị được đặc chất cơ bản: Lòng nhẫn nại.
- Chúng tôi tin bạn đã thực sự hiểu về hoàn cảnh hiện tại của bạn, và mục tiêu theo đuổi của bạn.
- Chúng tôi hy vọng hệ thống làm việc tại nhà - Work at Home (WAH) thực sự có thể giúp bạn thực hiện ước mơ của bạn.
- Chúng tôi cũng hy vọng bạn có thể chia sẻ tài nguyên cho các những người khác có cùng chí hướng.
- Rất tiếc, chúng tôi không thể không loại trừ một số người không phù hợp.
- Nếu bạn đã đọc kỹ các nội dung trên website, đồng thời cảm thấy đây là một mô hình làm việc lý tưởng, và thật sự muốn tìm hiểu sâu hơn, vui lòng bấm vào link đăng ký bên dưới, chúng tôi sẽ liên hệ bạn để trao đổi chi tiết với bạn.

WARC-Type: response

Content-Type: application/http; msgtype=response

WARC-Truncated: length

Connection: close

Server: cloudflare-nginx

Pragma: no-cache

Cache-Control: no-store, no-cache, must-revalidate

Vary: Accept-Encoding,User-Agent

Content-Type: text/html; charset=UTF-8