Máy ứng dụng của Google cho Java: Phần 3: Lưu giữ lâu bền và các mối quan hệ Lưu giữ lâu bền dựa vào Java và kho lưu trữ dữ liệu của Máy ứng dụng của Google Rick Hightower Giám đốc eBlox 28 05 2010 Lưu giữ lâu bền dữ liệu là một phần quan trọng của việc phân phối ứng dụng có khả năng mở rộng trong các môi trường doanh nghiệp. Trong bài viết cuối cùng của loạt bài giới thiệu của mình về Máy ứng dụng của Google (Google App Engine) cho Java™, Rick Hightower chấp nhận các thách thức của các khung công tác lưu giữ lâu bền dựa trên Java hiện có của Máy ứng dụng (App Engine). Tìm hiểu các chi tiết về tại sao việc lưu giữ lâu bền bằng Java trong bản các phát hành trước đây chưa phải là hoàn toàn sẵn sàng cho thời kỳ cao điểm, đồng thời cũng nhận được một trình diễn làm việc thực sự về những gì mà bạn có thể làm để lưu giữ lâu bền dữ liệu trong các ứng dụng của Máy ứng dụng cho Java. Chú ý rằng bạn sẽ cần phải có ứng dụng quản lý liên hệ từ Phần 2 và chạy nó khi bạn học cách sử dụng API JDO để lưu giữ lâu bền, truy vấn, cập nhật và xóa các đối tượng Contact (mối liên hệ). Xem thêm bài trong loạt bài này Máy ứng dụng cho Java cố gắng loại bỏ mối lo phải viết một tầng lưu giữ lâu bền cho các ứng dụng Web mở rộng được, nhưng nó thực hiện mục đích đó đến mức nào? Trong bài viết này, tôi kết thúc bài giới thiệu của mình về Máy ứng dụng cho Java với một tổng quan về khung công tác lưu giữ lâu bền của nó, dựa trên các đối tượng dữ liệu Java (Java Data Objects-JDO) và API lưu giữ lâu bền của Java (Java Persistence API-JPA). Mặc dù ban đầu tỏ ra nhiều hứa hẹn, việc lưu giữ lâu bền dựa trên Java của Máy ứng dụng hiện tại có một số nhược điểm nghiêm trọng mà tôi sẽ giải thích và chứng tỏ các nhược điểm đó. Bạn sẽ tìm hiểu xem việc lưu giữ lâu bền của Máy ứng dụng cho Java hoạt động như thế nào, những thách thức là gì và bạn có những tùy chọn lưu giữ lâu bền nào khi làm việc với nền tảng đám mây của Google dành cho các nhà phát triển Java. Khi bạn đọc bài viết này và làm việc qua các ví dụ, bạn sẽ muốn ghi nhớ một thực tế là Máy ứng dụng cho Java hiện nay là một bản phát hành xem trước. Khi mà việc lưu giữ lâu bền dựa trên Java có thể không phải là tất cả những gì mà bạn có thể hy vọng, hoặc cần có, vào lúc này, điều này là có thể và cần thay đổi trong tương lai. Những gì mà tôi học được trong khi viết bài hướng dẫn này © Copyright IBM Corporation 2010 Máy ứng dụng của Google cho Java: Phần 3: Lưu giữ lâu bền và các mối quan hệ Nhẫn hiệu đăng ký Trang 1 của 12 developerWorks® ibm.com/developerWorks/vn/ là việc sử dụng Máy ứng dụng cho Java để phát triển ứng dụng Java tập trung vào dữ liệu, có khả năng mở rộng, hiện nay, không phải dành cho những người nhút nhát hay bảo thủ. Nó giống như lặn xuống đáy bể bơi: Không còn ở trong tầm mắt của người cứu hộ nữa và dự án của bạn chìm xuồng hoặc bơi được là tùy thuộc nơi bạn. Chú ý rằng ứng dụng ví dụ trong bài viết này được dựa trên ứng dụng quản lý liên hệ đã phát triển trong Phần 2 của bài viết này. Bạn sẽ cần phải có ứng dụng đó đã xây dựng và chạy được để tiếp tục các ví dụ ở đây. Thành phần cơ bản và các sự trừu tượng hóa có lỗ rò Cũng giống như Máy ứng dụng của Google nguyên thủy, Máy ứng dụng cho Java dựa vào cơ sở hạ tầng nội bộ của Google với Ba Trụ Lớn (Big Three) để phát triển ứng dụng có khả năng mở rộng: phân tán, tạo bản sao và cân bằng tải. Vì bạn đang làm việc với cơ sở hạ tầng của Google, nên hầu hết các phép thuật này xảy ra ở hậu trường và bạn có thể truy cập qua các API tiêu chuẩn của Máy ứng dụng cho Java. Giao diện kho lưu trữ dữ liệu (datastore) được dựa trên JDO và JPA, mà chính chúng lại dựa trên dự án nguồn mở DataNucleus. Máy ứng dụng cho Java cũng cung cấp một API tiếp hợp (adapter) mức thấp để làm việc trực tiếp với kho lưu trữ dữ liệu của Máy ứng dụng cho Java, kho lưu trữ dữ liệu này dựa trên việc thực hiện BigTable của Google (xem Phần 1 để biết thêm về BigTable). Tuy nhiên, việc lưu giữ lâu bền dữ liệu của Máy ứng dụng cho Java là không hoàn toàn đơn giản như việc lưu giữ lâu bền trong Máy ứng dụng của Google thuần. Các giao diện JDO và JPA lộ ra một số sự trừu tượng hóa có lỗ rò do thực tế là BigTable không phải là một cơ sở dữ liệu quan hệ. Ví dụ, trong Máy ứng dụng cho Java, bạn không thể thực hiện các truy vấn mà chúng thực hiện các phép nối (join). Bạn có thể thiết lập các quan hệ trong JPA và JDO, nhưng chúng chỉ có thể được sử dụng để lưu giữ lâu bền các quan hệ. Và khi bạn lưu giữ lâu bền các đối tượng, chúng chỉ có thể được duy trì trong cùng một giao dịch nguyên tử nếu chúng ở trong cùng một nhóm thực thể. Theo quy ước, các quan hệ là quan hệ sở hữu nằm trong cùng nhóm thực thể với thực thể cha mẹ. Ngược lại, các mối quan hệ không sở hữu nằm trong các nhóm thực thể tách biệt. Nghĩ lại về chuẩn hóa dữ liệu Làm việc với kho lưu trữ dữ liệu có khả năng mở rộng của Máy ứng dụng đòi hỏi bạn phải suy nghĩ lại luận thuyết của mình về các lợi ích của dữ liệu được chuẩn hóa. Tất nhiên, nếu bạn đã làm việc đủ lâu trong thế giới thực, có thể bạn đã phải một hai lần hy sinh sự chuẩn hóa để đổi lấy hiệu năng. Sự khác biệt là, khi làm việc với kho lưu trữ dữ liệu của Máy ứng dụng, bạn phải không chuẩn hóa sớm hơn và thường xuyên. Chưa chuẩn hóa không còn là một từ xấu nữa; thay vào đó, nó là một công cụ thiết kế mà bạn sẽ áp dụng trong nhiều khía cạnh của các ứng dụng của Máy ứng dụng cho Java của bạn. Nhược điểm chính với Máy ứng dụng cho sự lưu giữ lâu bền có lỗ rò của Java sẽ xuất hiện khi bạn cố gắng chuyển một ứng dụng được viết cho một RDBMS tới Máy ứng dụng cho Java. Kho lưu trữ dữ liệu của Máy ứng dụng cho Java không phải là một sự thay thế ngay lập tức cho một cơ sở dữ liệu quan hệ, do đó, những gì mà bạn làm với Máy ứng dụng cho Java có thể không dễ dàng diễn dịch để chuyển sang cho RDBMS. Lấy một lược đồ hiện có và mang nó sang kho lưu trữ dữ liệu là một kịch bản thậm chí ít khả năng hơn. Nếu bạn quyết định chuyển một ứng dụng doanh nghiệp Máy ứng dụng của Google cho Java: Phần 3: Lưu giữ lâu bền và các mối quan hệ Trang 2 của 12 ibm.com/developerWorks/vn/ developerWorks® Java kế thừa tới Máy ứng dụng, hãy nên tiến hành thận trọng và sao lưu nó với bản phân tích. Máy ứng dụng của Google là một nền tảng dành cho các ứng dụng được thiết kế riêng biệt cho nó. Sự hỗ trợ của Máy ứng dụng của Google cho Java cho JDO và JPA cho phép các ứng dụng này được chuyển ngược trở lại thành các ứng dụng doanh nghiệp truyền thống hơn, dù là chưa chuẩn hóa. Những rắc rối với các mối quan hệ Một nhược điểm khác của Máy ứng dụng cho Java trong bản phát hành xem trước hiện nay là việc xử lý các quan hệ của nó. Để tạo các quan hệ, hiện tại bạn phải sử dụng các phần mở rộng cho JDO đặc thù riêng cho Máy ứng dụng cho Java. Biết rằng các khóa được tạo ra dựa trên các tạo phẩm của BigTable — đó là, "khóa chính " có khóa đối tượng-cha mẹ được mã hóa vào tất cả các khóa của con của nó — bạn sẽ phải quản lý dữ liệu của mình trong một cơ sở dữ liệu không quan hệ. Một hạn chế khác là việc lưu giữ lâu bền dữ liệu. Các sự phức tạp nảy sinh nếu bạn sử dụng lớp Key (Khóa) không tiêu chuẩn của Máy ứng dụng cho Java. Trước hết, bạn sử dụng Key không tiêu chuẩn như thế nào khi chuyển mô hình của bạn sang một RDBMS? Thứ hai, máy GWT không thể dịch lớp Key, vì thế bất kỳ đối tượng mô hình nào sử dụng lớp này không thể được sử dụng như một phần của ứng dụng GWT của bạn. Tất nhiên, tại thời điểm viết bài này, Máy ứng dụng của Google cho Java mới chỉ là ở chế độ xem trước. Nó không được xem là đã sẵn sàng cho thời kỳ cao điểm. Điều này trở nên càng rõ ràng hơn khi nghiên cứu tài liệu hướng dẫn về các quan hệ trong JDO, rất thưa thớt và chứa các ví dụ chưa hoàn chỉnh. Bộ công cụ phát triển của Máy ứng dụng cho Java được gửi kèm một loạt các chương trình ví dụ. Nhiều ví dụ trong đó sử dụng JDO, mà không sử dụng JPA. Không có một ví dụ nào (kể cả ví dụ có tên là jdoexamples) nêu thí dụ về một quan hệ dù là đơn giản. Thay vào đó, tất cả các ví dụ chỉ sử dụng một đối tượng để lưu trữ dữ liệu trong kho lưu trữ dữ liệu. Nhóm thảo luận về Máy ứng dụng của Google cho Java bị tràn ngập những câu hỏi về cách làm thế nào để một quan hệ đơn giản hoạt động được, với vài câu trả lời. Một số nhà phát triển hình như đã có khả năng làm cho nó hoạt động, nhưng rất vất vả và gặp một số khó khăn. Điểm mấu chốt về các quan hệ trong Máy ứng dụng cho Java là bạn cần phải quản lý chúng mà không được hỗ trợ nhiều từ JDO hay JPA. Tuy nhiên, BigTable của Google là một công nghệ đã được thử thách để sản xuất các ứng dụng có khả năng mở rộng và bạn có thể xây dựng bên trên nó. Việc xây dựng bên trên BigTable giải phóng bạn, không cần phải làm việc với mặt ngoài API, còn chưa được hậu thuẫn đầy đủ. Mặt khác, bạn sẽ phải làm việc với một API mức thấp hơn. JDO trong Máy ứng dụng cho Java Khi mà việc chuyển một ứng dụng Java truyền thống sang Máy ứng dụng cho Java có thể không có ý nghĩa và thậm chí đã biết rằng có những thách thức về các quan hệ, vẫn có các kịch bản lưu giữ lâu bền mà ở đây việc sử dụng nền tảng này là có ý. Tôi sẽ kết thúc bài này bằng một ví dụ làm việc được, mang lại cho bạn một hương vị về việc Máy ứng dụng cho Java thực hiện lưu giữ lâu bền như thế nào. Chúng ta sẽ bắt đầu với ứng dụng quản lý-liên hệ được xây dựng trong Phần 2, lần này đi qua các thủ tục để thêm hỗ trợ cho việc lưu giữ lâu bền các đối tượng Contact bằng các phương tiện của kho lưu trữ dữ liệu của Máy ứng dụng cho Java. Máy ứng dụng của Google cho Java: Phần 3: Lưu giữ lâu bền và các mối quan hệ Trang 3 của 12 developerWorks® ibm.com/developerWorks/vn/ Trong bài trước, bạn đã tạo một GWT GUI đơn giản thực hiện các hoạt động CRUD trên các đối tượng Contact. Bạn đã định nghĩa giao diện đơn giản như thấy trong Liệt kê 1: Liệt kê 1. Giao diện ContactDAO đơn giản package gaej.example.contact.server; import java.util.List; import gaej.example.contact.client.Contact; public interface ContactDAO { void addContact(Contact contact); void removeContact(Contact contact); void updateContact(Contact contact); List<Contact> listContacts(); } Tiếp theo, bạn đã tạo ra một phiên bản giả, làm việc với dữ liệu trong một bộ sưu tập nằm ở bộ nhớ, như thấy trong Liệt kê 2: Liệt kê 2. ContactDAOMock làm giả DAO package gaej.example.contact.server; import gaej.example.contact.client.Contact; import import import import import java.util.ArrayList; java.util.Collections; java.util.LinkedHashMap; java.util.List; java.util.Map; public class ContactDAOMock implements ContactDAO { Map<String, Contact> map = new LinkedHashMap<String, Contact>(); { map.put("[email protected]", new Contact("Rick Hightower", "[email protected]", "520-555-1212")); map.put("[email protected]", new Contact("Scott Fauerbach", "[email protected]", "520-555-1213")); map.put("[email protected]", new Contact("Bob Dean", "[email protected]", "520-555-1214")); } public void addContact(Contact contact) { String email = contact.getEmail(); map.put(email, contact); } public List<Contact> listContacts() { return Collections.unmodifiableList(new ArrayList<Contact>(map.values())); } public void removeContact(Contact contact) { map.remove(contact.getEmail()); } public void updateContact(Contact contact) { map.put(contact.getEmail(), contact); } Máy ứng dụng của Google cho Java: Phần 3: Lưu giữ lâu bền và các mối quan hệ Trang 4 của 12 ibm.com/developerWorks/vn/ developerWorks® } Bây giờ hãy xem điều gì sẽ xảy ra khi bạn thay thế việc thực hiện mô hình giả bằng một phiên bản của ứng dụng tương tác với kho lưu trữ dữ liệu của Máy ứng dụng của Google. Với ví dụ này, bạn sẽ sử dụng JDO để lưu giữ lâu bền lớp Contact. Một ứng dụng được viết bằng cách sử dụng các trình cắm thêm Eclipse của Google (Google Eclipse Plugin) đã có tất cả các thư viện mà nó cần để sử dụng JDO. Nó cũng bao gồm một tệp jdoconfig.xml, do đó một khi bạn chú giải lớp Contact, bạn sẽ sẵn sàng để bắt đầu sử dụng JDO. Liệt kê 3 cho thấy giao diện ContactDAO được mở rộng để sử dụng API JDO để lưu giữ lâu bền, truy vấn, cập nhật và xóa các đối tượng: Liệt kê 3. ContactDAO với JDO package gaej.example.contact.server; import gaej.example.contact.client.Contact; import java.util.List; import javax.jdo.JDOHelper; import javax.jdo.PersistenceManager; import javax.jdo.PersistenceManagerFactory; public class ContactJdoDAO implements ContactDAO { private static final PersistenceManagerFactory pmfInstance = JDOHelper .getPersistenceManagerFactory("transactions-optional"); public static PersistenceManagerFactory getPersistenceManagerFactory() { return pmfInstance; } public void addContact(Contact contact) { PersistenceManager pm = getPersistenceManagerFactory() .getPersistenceManager(); try { pm.makePersistent(contact); } finally { pm.close(); } } @SuppressWarnings("unchecked") public List<Contact> listContacts() { PersistenceManager pm = getPersistenceManagerFactory() .getPersistenceManager(); String query = "select from " + Contact.class.getName(); return (List<Contact>) pm.newQuery(query).execute(); } public void removeContact(Contact contact) { PersistenceManager pm = getPersistenceManagerFactory() .getPersistenceManager(); try { pm.currentTransaction().begin(); // We don't have a reference to the selected Product. // So we have to look it up first, contact = pm.getObjectById(Contact.class, contact.getId()); pm.deletePersistent(contact); pm.currentTransaction().commit(); Máy ứng dụng của Google cho Java: Phần 3: Lưu giữ lâu bền và các mối quan hệ Trang 5 của 12 developerWorks® ibm.com/developerWorks/vn/ } catch (Exception ex) { pm.currentTransaction().rollback(); throw new RuntimeException(ex); } finally { pm.close(); } } public void updateContact(Contact contact) { PersistenceManager pm = getPersistenceManagerFactory() .getPersistenceManager(); String name = contact.getName(); String phone = contact.getPhone(); String email = contact.getEmail(); try { pm.currentTransaction().begin(); // We don't have a reference to the selected Product. // So we have to look it up first, contact = pm.getObjectById(Contact.class, contact.getId()); contact.setName(name); contact.setPhone(phone); contact.setEmail(email); pm.makePersistent(contact); pm.currentTransaction().commit(); } catch (Exception ex) { pm.currentTransaction().rollback(); throw new RuntimeException(ex); } finally { pm.close(); } } } Theo từng phương thức Bây giờ chúng ta hãy xem xét những gì đang xảy ra với mỗi một trong các phương thức trong Liệt kê 3. Bạn sẽ thấy rằng trong khi các tên phương thức có thể là mới, hành động của chúng phần nhiều là đã quen thuộc. Trước tiên, để truy cập vào PersistenceManager, bạn đã tạo ra một PersistenceManagerFactory tĩnh. Nếu bạn đã làm việc với JPA từ trước, PersistenceManager tương tự với một EntityManager trong JPA. Nếu bạn đã làm việc với Hibernate, PersistenceManager tương tự như một phiên Hibernate. Về bản chất, PersistenceManager là giao diện chính cho hệ thống lưu giữ lâu bền JDO. Nó đại diện cho một phiên làm việc với cơ sở dữ liệu. Phương thức getPersistenceManagerFactory() trả về PersistenceManagerFactory, được khởi tạo tĩnh, như chỉ ra trong Liệt kê 4: Liệt kê 4. getPersistenceManagerFactory() trả về PersistenceManagerFactory private static final PersistenceManagerFactory pmfInstance = JDOHelper .getPersistenceManagerFactory("transactions-optional"); public static PersistenceManagerFactory getPersistenceManagerFactory() { return pmfInstance; } Phương thức addContact() bổ sung thêm một mối liên hệ mới vào kho lưu trữ dữ liệu này. Để làm điều này, nó cần phải tạo ra một cá thể của PersistenceManager và sau đó gọi phương thức Máy ứng dụng của Google cho Java: Phần 3: Lưu giữ lâu bền và các mối quan hệ Trang 6 của 12 ibm.com/developerWorks/vn/ developerWorks® makePersistence() của PersistenceManager này. Phương thức makePersistence() lấy đối tượng Contact tạm thời (mà người dùng sẽ phải điền vào trong GWT GUI) và làm cho nó thành một đối tượng lưu giữ lâu bền. Tất cả những việc này được thể hiện trong Liệt kê 5: Liệt kê 5. addContact() public void addContact(Contact contact) { PersistenceManager pm = getPersistenceManagerFactory() .getPersistenceManager(); try { pm.makePersistent(contact); } finally { pm.close(); } } Chú ý trong Liệt kê 5 persistenceManager được gói trong một khối finally như thế nào. Điều này đảm bảo nó xóa nguồn tài nguyên kết hợp với persistenceManager. Phương thức listContact(), được hiển thị trong Liệt kê 6, tạo ra một đối tượng truy vấn từ persistenceManager mà nó tìm kiếm. Nó gọi phương thức execute(), trả về danh sách các Contact từ kho lưu trữ dữ liệu. Liệt kê 6. listContact() @SuppressWarnings("unchecked") public List<Contact> listContacts() { PersistenceManager pm = getPersistenceManagerFactory() .getPersistenceManager(); String query = "select from " + Contact.class.getName(); return (List<Contact>) pm.newQuery(query).execute(); } Phương thức removeContact() tìm kiếm mối liên hệ bằng mã nhận dạng (ID) trước khi nó loại bỏ mối liên hệ ấy khỏi kho lưu trữ dữ liệu, như chỉ ra trong Liệt kê 7. Nó phải làm điều này chứ không phải chỉ xóa ngay mối liên hệ vì đối tượng Contact đến từ GWT GUI không biết gì về JDO. Bạn phải lấy ra một Contact được kết hợp với một vùng nhớ nhanh (cache) của PersistenceManager trước khi bạn có thể xóa nó. Máy ứng dụng của Google cho Java: Phần 3: Lưu giữ lâu bền và các mối quan hệ Trang 7 của 12 developerWorks® ibm.com/developerWorks/vn/ Liệt kê 7. removeContact() public void removeContact(Contact contact) { PersistenceManager pm = getPersistenceManagerFactory() .getPersistenceManager(); try { pm.currentTransaction().begin(); // We don't have a reference to the selected Product. // So we have to look it up first, contact = pm.getObjectById(Contact.class, contact.getId()); pm.deletePersistent(contact); pm.currentTransaction().commit(); } catch (Exception ex) { pm.currentTransaction().rollback(); throw new RuntimeException(ex); } finally { pm.close(); } } Phương thức updateContact(), trong Liệt kê 8, tương tự như phương thức removeContact(), ở chỗ là nó cũng tìm kiếm Contact. Phương thức updateContact() sau đó sao chép các thuộc tính từ Contact. Các thuộc tính này được chuyển như một đối số đến Contact, đã được tìm kiếm với trình quản lý lưu giữ lâu bền. PersistenceManager kiểm tra các thay đổi của các đối tượng được tìm kiếm. Nếu một đối tượng đã thay đổi, các thay đổi này được PersistenceManager trút sang cơ sở dữ liệu khi một giao dịch cam kết. Liệt kê 8. updateContact() public void updateContact(Contact contact) { PersistenceManager pm = getPersistenceManagerFactory() .getPersistenceManager(); String name = contact.getName(); String phone = contact.getPhone(); String email = contact.getEmail(); try { pm.currentTransaction().begin(); // We don't have a reference to the selected Product. // So we have to look it up first, contact = pm.getObjectById(Contact.class, contact.getId()); contact.setName(name); contact.setPhone(phone); contact.setEmail(email); pm.makePersistent(contact); pm.currentTransaction().commit(); } catch (Exception ex) { pm.currentTransaction().rollback(); throw new RuntimeException(ex); } finally { pm.close(); } } Chú giải cho việc lưu giữ lâu bền đối tượng Để một Contact được lưu giữ lâu bền, bạn phải nhận biết nó như là một đối tượng có khả năng lưu giữ lâu bền với chú giải @PersistenceCapable. Sau đó bạn cần phải chú giải tất cả các trường có khả năng lưu giữ lâu bền của nó, như thể hiện trong Liệt kê 9: Máy ứng dụng của Google cho Java: Phần 3: Lưu giữ lâu bền và các mối quan hệ Trang 8 của 12 ibm.com/developerWorks/vn/ developerWorks® Liệt kê 9. Contact có khả năng lưu giữ lâu bền package gaej.example.contact.client; import java.io.Serializable; import import import import import javax.jdo.annotations.IdGeneratorStrategy; javax.jdo.annotations.IdentityType; javax.jdo.annotations.PersistenceCapable; javax.jdo.annotations.Persistent; javax.jdo.annotations.PrimaryKey; @PersistenceCapable(identityType = IdentityType.APPLICATION) public class Contact implements Serializable { private static final long serialVersionUID = 1L; @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Long id; @Persistent private String name; @Persistent private String email; @Persistent private String phone; public Contact() { } public Contact(String name, String email, String phone) { super(); this.name = name; this.email = email; this.phone = phone; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; Máy ứng dụng của Google cho Java: Phần 3: Lưu giữ lâu bền và các mối quan hệ Trang 9 của 12 developerWorks® ibm.com/developerWorks/vn/ } } Nhờ sự kỳ diệu của lập trình hướng đối tượng và các nguyên lý thiết kế bằng giao diện, bạn có thể thay thế ContactDAOMock ban đầu của bạn bằng ContactJdoDAO mới. GWT GUI sau đó sẽ làm việc với JDO mà không cần thay đổi. Cuối cùng, cái thực sự thay đổi với sự trao đổi này là cách mà DAO được thuyết minh trong dịch vụ, như thể hiện trong Liệt kê 10: Liệt kê 10. RemoteServiceServlet public class ContactServiceImpl extends RemoteServiceServlet implements ContactService { private static final long serialVersionUID = 1L; //private ContactDAO contactDAO = new ContactDAOMock(); private ContactDAO contactDAO = new ContactJdoDAO(); ... Kết luận Trong bài viết ba phần này, tôi đã giới thiệu sự hỗ trợ hiện tại của Máy ứng dụng của Google cho Java dành cho việc lưu giữ lâu bền, nó là một trong những hòn đá tảng của việc phân phối ứng dụng có khả năng mở rộng. Tổng thể những điều phát hiện được là khá thất vọng, mặc dù điều quan trọng là cần nhớ rằng đây là một nền tảng đang phát triển. Các ứng dụng được viết cho bản phát hành xem trước của Máy ứng dụng cho Java được buộc chặt với cơ sở hạ tầng lưu giữ lâu bền của Máy ứng dụng, mặc dù chúng có thể sử dụng JDO hay JPA. Máy ứng dụng cho Java trong phiên bản xem trước của nó cũng cung cấp ít tài liệu hướng dẫn về khung công tác lưu giữ lâu bền của nó và các ví dụ mà Máy ứng dụng cho Java gửi kèm làm cho gần như không thể triển khai thực hiện được các quan hệ dù là đơn giản. Thậm chí nếu việc hiện thực JDO và JPA hoàn toàn là mô hình giả, thì hiện nay hầu như không có khả năng để bạn có thể viết một ứng dụng của Máy ứng dụng cho Java và chuyển nó một cách dễ dàng sang thành một ứng dụng doanh nghiệp dựa trên-DBMS. Ít nhất, bạn sẽ phải làm một số công việc nặng về mã hóa để thực hiện chuyển đổi đó. Hy vọng của tôi về việc lưu giữ lâu bền là nó sẽ hoàn thiện theo thời gian. Nếu bạn thực sự cần phải làm việc với Máy ứng dụng cho Java ngay bây giờ, có thể bạn sẽ muốn bỏ qua các API Java và viết trực tiếp đến API kho lưu trữ dữ liệu mức thấp. Làm việc với nền tảng Máy ứng dụng cho Java là có thể được, nhưng nếu bạn quen làm việc với JPA và/hoặc JDO, thì bạn sẽ phải tìm hiểu khá nhiều, cả do sự trừu tượng hóa có lỗ rò được mô tả ở đầu của bài viết này lẫn do các tính năng hoặc vẫn chưa làm việc tốt hoặc hiện nay chưa có tài liệu hướng dẫn tốt. Máy ứng dụng của Google cho Java: Phần 3: Lưu giữ lâu bền và các mối quan hệ Trang 10 của 12 ibm.com/developerWorks/vn/ developerWorks® Tài nguyên Học tập • "Máy ứng dụng của Google cho Java, Phần 1: Rồ máy lên!" (Rick Hightower, developerWorks, 08.2009): Bắt đầu với các trình cắm thêm Eclipse cho Máy ứng dụng cho Java và tìm hiểu làm thế nào để nhanh chóng xây dựng các ứng dụng đơn giản có thể mở rộng. • "Máy ứng dụng của Google cho Java, Phần 2: Xây dựng ứng dụng sát thủ" (Rick Hightower, developerWorks, 08.2009): Kích thích lòng ham muốn về những gì có thể về Máy ứng dụng, với bài hướng dẫn ngắn về việc xây dựng một GWT GUI tùy chỉnh cho ứng dụng quản lý liên hệ. Điều kiện cần có trước để hoàn thành các bài tập trong hướng dẫn này. • "Nối đến đám mây, Phần 1: Sử dụng đám mây trong các ứng dụng" (Mark O'Neill, developerWorks, 04.2009): Một tổng quan ba phần về các nền tảng điện toán đám mây từ các nhà cung cấp lớn: Amazon, Google, Microsoft® và SalesForce.com. • Phiên video IO của Google: Khía cạnh mềm mại hơn của các lược đồ: Max Ross, kỹ sư của Google, giải thích JDO và JPA tiêu chuẩn tương tác với kho lưu trữ dữ liệu của Máy ứng dụng của Google như thế nào. • Hướng dẫn JDO, dự án Apache DB: Tìm hiểu cách sử dụng ObjectRelationalBridge và JDO API trong một kịch bản ứng dụng đơn giản. • BigTable là gì?: Đọc ấn phẩm nghiên cứu của Google để tìm hiểu. • Dự án DataNucleus: Một dự án mã nguồn mở cung cấp một loạt các sản phẩm phần mềm xung quanh việc quản lý dữ liệu bằng cách sử dụng ngôn ngữ lập trình Java; trước đây là Các đối tượng lưu giữ lâu bền của Java (Java Persistent Objects -JPOX). • Trang chủ của Máy ứng dụng của Google: Tìm hiểu thêm về Máy ứng dụng. • Các tài liệu Java của Máy ứng dụng của Google: Thông tin thêm về việc phát triển Java với Máy ứng dụng cho Java. • Nó có chạy được trong Máy ứng dụng cho Java không?: Tìm hiểu các Java API tiêu chuẩn và các khung công tác nào tương thích với Máy ứng dụng cho Java. • Duyệt qua hiệu sách công nghệ với các sách về chủ đề kỹ thuật này và các chủ đề khác. • Vùng công nghệ Java của developerWorks: Tìm hàng trăm bài viết về mọi khía cạnh về lập trình Java. Lấy sản phẩm và công nghệ • Các trình cắm thêm của Google cho Eclipse: Tải về các trình cắm thêm để bắt đầu. • Tài khoản của Máy ứng dụng: Bạn sẽ cần một tài khoản để triển khai ứng dụng sát thủ của bạn khi sử dụng cơ sở hạ tầng Máy ứng dụng của Google. Thảo luận • Nhóm thảo luận của Máy ứng dụng cho Java: Đăng ký vào nhóm này để đóng góp và nhận sự giúp đỡ và lời khuyên khi bạn tìm hiểu về Máy ứng dụng cho Java. • Dành tâm trí cho cộng đồng My developerWorks. Máy ứng dụng của Google cho Java: Phần 3: Lưu giữ lâu bền và các mối quan hệ Trang 11 của 12 developerWorks® ibm.com/developerWorks/vn/ Đôi nét về tác giả Rick Hightower Rick Hightower phục vụ với tư cách là giám đốc công nghệ cho Mammatus Inc., một công ty đào tạo chuyên về phát triển điện toán đám mây, GWT, Java EE, Spring và Hibernate. Ông là đồng tác giả của cuốn sách nổi tiếng Các công cụ Java cho lập trình cực biên (Java Tools for Extreme Programming) và tác giả của ấn bản đầu tiên của Struts Live — được tải về nhiều nhất trên TheServerSide.com trong nhiều năm. Ông cũng đã viết các bài báo và các hướng dẫn cho developerWorks của IBM và ở trong Ban biên tập của Tạp chí nhà phát triển Java, cũng như là một cộng tác viên thường xuyên về các chủ đề Java và Groovy trên DZone © Copyright IBM Corporation 2010 (www.ibm.com/legal/copytrade.shtml) Nhẫn hiệu đăng ký (www.ibm.com/developerworks/vn/ibm/trademarks/) Máy ứng dụng của Google cho Java: Phần 3: Lưu giữ lâu bền và các mối quan hệ Trang 12 của 12