Trong phần này chúng ta sẽ thảo luận về cách mà áp dụng datastore trong việc lưu trữ tài khoản người dùng và sơ đồ. Vì thời gian dự án có hạn, trong phần demo lần này chúng tôi thiết kế cơ sở dữ liệu thật nhỏ gọn đủ để đáp ứng việc lưu trữ tài khoản người dùng và mô hình.
Trong demo chúng ta chỉ có duy nhất một đối tượng được lưu trữ, đó là đối tượng Account trong gói com.luong.server.persistence.Account.java.
package com.luong.server.persistent; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; import javax.jdo.PersistenceManager; import javax.jdo.Query; import javax.jdo.annotations.Element; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.IdentityType; import javax.jdo.annotations.PersistenceCapable; import javax.jdo.annotations.Persistent; import javax.jdo.annotations.PrimaryKey; import com.luong.server.PMF; import com.luong.shared.UserAccountDTO; @PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true")
public class UserAccount { @PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Long id;
@Persistent
private String uniqueId; @Persistent
private String name;
@Persistent
private String emailAddress;
@Persistent
private List<com.google.appengine.api.datastore.Text> diagram; Các chúng ta chú ý chúng ta cần import các gói cần thiết vào import javax.jdo.PersistenceManager;
import javax.jdo.Query;
Kiểu mối quan hệ ở phía endHead 0..1 1) Nếu không có phụ thuộc hàm Kéo khóa chính ở endEntity về làm khóa ngoại bên startEntity. Ngược lại kéo về endEntity làm khóa chính Các Khóa ngoại có thể null
Giống 1) Giống 1) Giống 1)
1..1 2)
Nếu không có phụ thuộc hàm kéo khóa chính ở endEntity về làm khóa ngoại bên startEntity
Ngược lại kéo về startEntity làm khóa chính
Các khóa ngoại không null
Giống 2)
Nhưng trong trường hợp này endEntity cũng có thể có phụ thuộc hàm nên khi có phụ thuộc hàm sẽ kéo về phía có phụ thuộc hàm Giống 2) Giống 2) 0..n 3) Kéo khóa chính về endEntity làm khóa ngoại, Khóa ngoại có thể null 4) Nếu không có phụ thuộc hàm kéo khóa chính về endEntity làm khóa ngoại , khóa ngoại không null
Ngược lại kéo khóa 5) Tạo một bảng mới, kéo các khóa chính của 2 bảng về bảng mới làm khóa chính Giống 5)
Các anotation @Persistence cho biết thuộc tính đó cần sẽ được lưu lại trong datastore, @PrimaryKey nói lên thuộc tính đó là khóa chính trong khóa chính có dòng valueStrategy = IdGeneratorStrategy.IDENTITY câu này xác định khóa chính sẽ được tự động sinh ra bởi datastore.
Để có thể tạo lưu trữ, cập nhật và truy vấn một đối tượng vào datastore ta cần sử dụng đối tượng PersistenceManager, và đối tượng này được tạo từ đối tượng PersistenceManagerFactory. Nhưng để tạo một đối tượng PersistenceManagerFactory mất rất nhiều thời gian, nên chúng ta sẽ sử dụng mẫu Singleton pattern bằng cách tạo ra một lớp ở gói com.luong.server.PMF.
import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManagerFactory; public final class PMF {
private static final PersistenceManagerFactory pmfInstance =
JDOHelper.getPersistenceManagerFactory("transactions-optional"); private PMF() {}
public static PersistenceManagerFactory get() { return pmfInstance;
} }
Sau đây là một đoạn code mà chúng tôi sử dụng để lưu trữ một đối tượng useraccount
PersistenceManager pm = PMF.get().getPersistenceManager(); Query q = pm.newQuery(UserAccount.class, "uniqueId == :uniqueId");
q.setUnique(true);
UserAccount result = (UserAccount) q.execute(currentUser.getUniqueId()); if(result == null) { pm.makePersistent(currentUser); detached = pm.detachCopy(currentUser); } else detached = pm.detachCopy(result); pm.close(); q.closeAll();
Đoạn code trên đầu tiên là tạo get một đối tượng PersistenceManager() để tạo một querry, câu lệnh querry này làm nhiệm vụ lấy lên một đối tượng user trong datastore có uniqueId, nếu đối tượng đó có tồn tại thì ta ko lưu nó vào nữa mà chỉ
lấy nó ra, còn nếu chưa tồn tại thì ta lưu nó lại bằng cách gọi hàm pm.makePersistent().
JDO là một công nghệ tương đối phức tạp nếu các chúng ta thực sự muốn tìm hiểu chi tiết có thể tham khảo chương 4 và chương 5 của tài liệu số [3] trong danh sách tài liệu tham khảo.