Java开发2.0: 使用Amazon SimpleDB实现云存储,第2部分
2010-10-26 12:59:16 来源:Web开发网处理域对象
一旦您拥有了一个 EntityManager 对象,您就可根据需要处理域对象了。例如,我可以像下面一样创建一个 Race 实例:
清单 9. 创建一个 Race
Race race = new Race();
race.setName("Charlottesville Marathon");
race.setLocation("Charlottesville, VA");
race.setDistance(new BigDecimal(26.2));
em.persist(race);
在 清单 9 中,SimpleJPA 处理了所有 HTTP 请求来在云中创建 Race。使用 SimpleJPA 意味着我也能够使用一个 JPA 查询来查询比赛,如清单 10 所示。(记住您不能够联合这些查询,但是我仍然可以使用数字进行搜索。)
清单 10. 根据实例查找一个比赛
Query query = em.createQuery("select o from Race o where o.distance = :dist");
query.setParameter("dist", new BigDecimal(26.2));
List<Race> races = query.getResultList();
for(Race race : races){
System.out.println(race);
}
从数字到字符串
例如,SimpleJPA 内部的数字到字符串转换的方法是非常有用的,如果您在 SimpleJPA 中启用查询输出,那么您可以看到有哪些查询发送到 SimpleDB。所提交的查询如清单 11 所示。注意 distance 是如何编码的。
清单 11. SimpleJPA 很好地处理数字!
amazonQuery: Domain=b50-Race, query=select * from `b50-Race`
where `distance` = '0922337203685477583419999999999999928946'
自动填充和编码使开发更加简单,您不觉得吗?
SimpleJPA 中的关系
即使 SimpleDB 不允许查询中进行域联合,您也仍然可以在域中使用关联项。正如我在 第 1 部分 中介绍的,您在一个对象中存储另一个相关对象的键,然后在您需要时查询这个对象。这也正是 SimpleJPA 所做的。例如,之前我向您介绍了如何使用 JPA 注释将 Runner 链接到一个 Race。因此,我可以创建一个 Runner 实例,将现有的 race 添加到这个实例,然后再存储 Runner 实例,如清单 12 所示:
清单 12. 使用 SimpleJPA 处理关系
Runner runner = new Runner();
runner.setName("Mark Smith");
runner.setSsn("555-55-5555");
runner.setRace(race);
race.addRunner(runner);
em.persist(runner);
em.persist(race); //update the race now that it has a runner
从 清单 12 我们也可以看到,我需要更新 Race 实例,这样我所添加的 Runner 才会被存储起来(同时,我给 Race 函数添加了一个 addRunner 函数,它只是直接将一个 Runner 添加到 Runner 内部的 Collection。)
再一次,如果我通过它的实例搜索一个比赛,我也可以得到它的一组选手,如清单 13 所示:
清单 13. 更多有趣的关系操作!
Query query = em.createQuery("select o from Race o where o.distance = :dist");
query.setParameter("dist", new BigDecimal(26.2));
List<Race> races = query.getResultList();
for(Race races : race){
System.out.println(race);
List<Runner> runners = race.getRunners();
for(Runner rnr : runners){
System.out.println(rnr);
}
}
使用 EntityManager 实例使我能够通过 remove 函数删除一些实体,如清单 14 所示:
清单 14. 删除一个类的实例
Query query = em.createQuery("select o from Race o where o.distance = :dist");
query.setParameter("dist", new BigDecimal(26.2));
List<Race> races = query.getResultList();
for(Race races : race){
em.remove(race);
}
当我在 清单 14 中删除了一个 Race 实例,所关联的 Runners 并没有删除。(当然,我可以使用 JPA 的 EntityListeners 注释来处理这个问题,这意味着我可以监控删除事件,在事件发生时删除 Runner 实例。)
结束语
这篇 SimpleDB 的快速教程向您介绍了如何使用 Amazon Web Services API 和 SimpleJPA 来处理非关系数据存储的对象。SimpleJPA 实现了一部分的 Java Persistence API 来简化 SimpleDB 的对象持久化。您已经看到,使用 SimpleJPA 的其中一个好处是它能够自动地将基本数据类型转换为 SimpleDB 能识别的字符串对象。SimpleJPA 也能够自动地处理 SimpleDB 中的非联合规则,从而简化它的关系建模。SimpleJPA 扩展的监听接口也使它能够实现逻辑数据统一规则,这是您在关系数据库所希望使用的。
SimpleJPA 的关键是它能够帮助您快速简单且廉价地实现重要的可扩展性。通过 SimpleJPA,您可以在非关系的、基于云的存储环境中利用您在多年的工作中所接触到的诸如 Hibernate 等框架的知识。
更多精彩
赞助商链接