以下内容出自GAE_GWT入门指南,我只是做了下学习笔记。
定义数据类。
我们要成功定义一个数据类,需要注意很多事情,否则在使用时候会发现无故报错,无法保存。需要注意一下事项。
1,类和字段批注。
成功声明一个类,字段批准是必须的。JDO保存每个对象都将成为App Engine数据存储区的实体。类的每个持久字段
代表实体的的一个属性。要将java类声明为为能够通过JDO在数据存储区中存储或检索,我们必须指定@PersistenceCapable批注。
例如
import javax.jdo.annotations.PersistenceCapable;
@PersistenceCapable(identityType=IndentityType.APPLICATION)
public class Employee {
}
要存储到数据存储区中的数据类的字段必须声明为持久字段(@Persistent)
不保存到数据存储区,也不会在检索对象时还原,@NotPersistent
import javax.jdo.annotations.NotPersistent;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
@PersistenceCapable(identityType=IndentityType.APPLICATION)
public class Employee {
/** 持久化*/
@Persistent
private Date hireDate;
/** 非持久化*/
@NotPersistent
private Date age;
}
数据类必须具有一个专门用于数据存储相应的数据存储区实体的主键字段。
主键使用@PrimaryKey批注,自动填充需要批注。
@PrimaryKey 和@Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY)
请将我们所有的持久字段指定为private 或者 protected,且只通过访问器方法提供公共访问,这样符合相应的规范需求。
import javax.jdo.annotations.NotPersistent;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
@PersistenceCapable(identityType=IndentityType.APPLICATION)
public class Employee {
@Persistent
private long id;
@Persistent
private String fistName;
@Persistent
private String lastName;
@Persistent
private String hireDate;
public Employee(long id, String fistName, String lastName, String hireDate) {
this.id = id;
this.fistName = fistName;
this.lastName = lastName;
this.hireDate = hireDate;
}
/**Accessors for the fields.JDO doen't use these,but your application does*/
public String getFistName() {
return fistName;
}
public void setFistName(String fistName) {
this.fistName = fistName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getHireDate() {
return hireDate;
}
public void setHireDate(String hireDate) {
this.hireDate = hireDate;
}
}
二 核心值类型
AppEngine支持的数据类型很多,基本数据的数据都支持。
三 数据的父子关系。
在操作数据时,通常会遇到两个数据类型中,一个数据类型中包含另外一个声明的数据类型。
如果只是单个的包含,那么两个数据实例之间是一对一的关系,如果是集合,就是创建的数
据就是一对多的关系,以下是employee对象和contactInfo对象,他们是一对一的关系。
public class Employee {
@Persistent (valueStrategy=IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
private ContactInfo myContactInfo;
@Persistent
private String fistName;
public class ContactInfo {
@PrimaryKey (valueStrategy=IdGeneratorStrategy.IDENTITY)
private Key key;
在此例中,Employee和myContactInfo是一一对应关系,Employee是父,myContactInfo是子。
myContactInfo相当于Employee中的一个常规数据类型,myContacInfo和employee的主键都用
父类实体employee对象中的主键。
四,嵌入类
通过嵌入类,可以使用类来建模字段值,无需创建新的数据存储区实体并形成关系,该对象的
字段之间存储在含有对象的数据存储区实体中。
任何@PersistenceCapable数据类都可以作用于另一个数据类中的嵌入对象。类的@Persistent
字段嵌入到对象中,如果让类嵌入@EmbeddedOnly批注,则类只能用作嵌入类,嵌入类不需要主键
字段,因为他不作为单独实体存储。
public class EmployeeContacts {
@PrimaryKey
@Persistent (valueStrategy=IdGeneratorStrategy.IDENTITY)
private Long id;
@PersistenceCapable
@EmbeddedOnly
public static class ContackInfo
{
@Persistent
private String streetAddress;
@Persistent
private String city;
@Persistent
private String stateOrProvince;
@Persistent
private String zipCode;
}
@Persistent
/××批注指定新的字段名称×/
@Embedded
private ContactInfo homeContactInfo;
@Persistent
@Embedded(members={
@Persistent(name="streetAddress",columns @Column(name="wrokStreetAddress")),
@Persistent(name="city",column(name="workCity")),
@Persistent(name="stateOrProvince",columns @Coloumn(name="workStateOrProvince")),
});
private ContactInfo workContactInfo;
}
类似的对象上的字段不可以使用与嵌入类的字段冲突的名称,除非重命名嵌入字段。
集合:
一个数据存储区属性可以具有多个值,形成一对多的关系,基本数据类型有:
java.util.ArrayList HashSet LinkedHashSet LinkedLIist List set sortedSet
java.util.HashSet
java.util.LinkedHashSet
java.util.LinkedLIist
java.util.List
java.util.set
java.util.sortedSet
java.util.stack
java.util.Treeset
java.util.Vector
如果某个字段声明为list,则数据存储区返回的对象具有ArrayList值。
如果某个字段声明为set,则数据存储区返回的对象具有HashSet值。
如果某个字段声明为sortedSet,则数据存储区返回的对象具有TreeSet值。
例如,类型为list<String>的字段存储为属性的零个或多个字符串值,每一个对应于list中的一个值。
import java.util.list;
@Persistent
List<String> favoriteFoods;
数据定义总结,
关注的是批注,每个批注都有自己的意义,如果没有批注,数据将无法保存到数据库中。
数据之间的关系有一对一,一对多,嵌套。在子的数据类型的键,应该定义成key这种数据类型,
因为子的键要包含父的键,形成对应的关联。