Java开发2.0: 使用Amazon SimpleDB实现云存储,第2部分
2010-10-26 12:59:16 来源:Web开发网JPA 中的注释
要使这两个对象能够使用 SimpleJPA 并不是很难。首先,我需要通过为每个对象添加 @Entity 注释来将它们变成可持久化的。我也需要在 Race 对象中使用 @OneToMany,在 Runner 对象中使用 @ManyToOne 来正确定义它们的关系。
@Entity 注释是在类上标注的,而关系注释是在 getter 函数上标注的。这些注释见清单 3 和 4:
清单 3. JPA 注释的 Race
@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...
}
在 清单 3 中,我使用 @OneToMany 注释来标注 getRunners 函数。我也在实例 Runner 的 race 属性上定义了一个关系。
在清单 4 中,我用类似的方法注释了 Runner 对象的 getRace 函数。
清单 4. JPA 注释的 Runner
@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...
}
大多数数据存储(关系型或非关系型)都需要某种描述数据唯一性的方法。所以如果我将这两个对象存储到数据存储中,我至少需要给它们添加 ID。在清单 5 中,我添加一个类型为 BigInteger 的 id 属性到 Race 域对象。在 Runner 对象中我会使用相同的做法。
清单 5. 给 Race 添加一个 ID
@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...
}
清单 5 中的 @Id 注释并没有关于 ID 是如何管理的信息。这样程序就会假设由我手动管理这个 ID,而不是使用 EntityManager 来管理。
进入 SimpleJPA
到现在为止,我还没有进行任何 SimpleDB 的配置。Race 和 Runner 对象都只是使用 JPA 注释进行标注,从而可以存储在任何由 JPA 实现所支持的数据存储中。可选的存储方式包括 Oracle、DB2、MySQL 和(您可能已经猜到的)SimpleDB。
SimpleJPA 是 Amazon 的 SimpleDB 的开源实现。虽然它并不支持完整的 JPA 规范(例如,您不能联合 JPA 查询),但是它支持大量很有用的一部分 JPA 规范。
使用 SimpleJPA 的一个很大的优点是它能够无缝地处理我在 本文的第 1 部分 中所讨论的按字母的问题。SimpleJPA 会对依赖于数字类型的对象进行字符串转换和后续的填充(如果需要)。在大多数情况中,这意味着您不需要修改您的域模型来使用 String 类型。(其中只有一个例外情况,我将在后面进行讨论。)
因为 SimpleJPA 是一个 JPA 实现,您可以很容易在其中使用符合 JPA 的域对象。SimpleJPA 只要求您使用 String ID,这意味着您的 id 属性必须是 java.lang.String。为了简化,SimpleJPA 提供了基本的类 IdedTimestampedBase,它负责管理域对象的 ID 属性,以及日期属性 created 和 updated。(在底层, SimpleDB 会生成一个唯一的 Id。)
更多精彩
赞助商链接