關於 Data persitence API,由於考慮到使用雲端服務(ex.GAE)所以找了一下支援的API,發現Siena還不錯,所以先拿來試試看。
目前觀察到Siena 有以下特性:
1. 容易上手,設計也很直覺
2. 同時支援兩大雲端服務
3. 支援目前所有熱門的關聯式資料庫 (採用Apache DdlUtils)
以下是關於Siena Project 的說明
Siena is a single API with many implementations. You can use siena with relational databases, with the Google App Engine's datastore or with Amazon's SimpleDB. There is also an implementation called siena-remote very useful if you want to use the Google App Engine's datastore remotely. Other implmenetations are planned such as: HBase, DBSLayer,...
Siena is Open Source and is released under the Apache License 2.0.
這個範例中會用到兩個資料物件,分別是Member 和 MemberCard,兩者的關係是一個Member會有多張MemberCard(也就是一對多的關係)。下面貼出範例的程式碼供參考:
Member.java
package models; import java.util.*; import siena.*; public class Member extends Model{ @Id(Generator.AUTO_INCREMENT) public Long id; @Column("first_name") public String firstName; @Column("last_name") public String lastName; @Column("gender") public Integer gender; @Column("email") public String email; public Member(String firstName, String lastName, int gender, String email) { this.firstName = firstName; this.lastName = lastName; this.gender = gender; this.email = email; } public static Query<Member> all() { return Model.all(Member.class); } public static List<Member> getall() { return all().fetch(); } public static Member findById(Long id) { return all().filter("id", id).get(); } public static Query<MemberCard> findByMember(Long id) { Member theMember= all().filter("id", id).get(); Query<MemberCard> cards = MemberCard.all().filter("member", theMember); return cards; } }
MemberCard.java
package models; import java.util.Date; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.OneToMany; import siena.Column; import siena.Generator; import siena.Id; import siena.Model; import siena.Query; public class MemberCard extends Model { @Id @Column("cardID") public String cardID; @Column("StartDate") public Date startDate; @Column("endDate") public Date endDate; @Column("member") public Member member; public MemberCard(String cardID) { this.cardID = cardID; } public MemberCard(String cardID, Member member) { this.cardID = cardID; this.member = member; } public static Query<MemberCard> all() { return Model.all(MemberCard.class); } public static List<MemberCard> getall() { return all().fetch(); } public static MemberCard findById(String cardID) { return all().filter("cardID", cardID).get(); } }