进入旧版 | 服务项目 | 成功案例 | 联系方式 | 过客留言 | 友情链接
   
设为首页
加入收藏
联系我们
网站首页 | 新闻资讯 | 操作系统 | 办公软件 | 网络软件 | 工具软件 | 媒体动画 | 网页制作 | 网站开发 | 程序开发 | 平面设计
Photoshop视频教程 | Word入门 | Flash入门 | JScript | VBScript | ASP | PHP | ADO | 网页特效 | 3DS MAX6.0命令 | 系统进程
您当前的位置:GOODSGY电脑学习网 -> 程序开发 -> JAVA -> 文章内容  
面向Java程序员的db4o指南: 数组和集合

www.goodsgy.com

 www.goodsgy.com

理解关系 

  您可能会感到奇怪,清单 5 中显示的基于 Collection 的类型(ArrayList)没有被存储为 Person 类型的 “dependents”,而是被存储为一个成熟的对象。这还说得过去,但是当对对象数据库中的 ArrayList 运行一个查询时,它可能,有时候也确实会导致返回奇怪的结果。由于目前数据库中只有一个 ArrayList,所以还不值得运行一个探察测试,看看当对它运行一个查询时会出现什么情况。我把这作为留给您的练习。

  自然地,存储在一个集合中的 Person 也被当作数据库中的一级实体,所以在查询符合某个特定标准(例如所有女性 Person)的所有 Person 时,也会返回 ArrayList 实例中引用到的那些 Person,如清单 6 所示。

  清单 6. 什么是 Julia?

@Test public void findTheGirls()
{
 List<Person> girls = db.query(new Predicate<Person>() {
  public boolean match(Person candidate) {
   return candidate.getGender().equals(Gender.FEMALE);
  }
 });
 boolean maggieFound = false;
 boolean kaylaFound = false;
 boolean juliaFound = false;
 for (Person p : girls)
 {
  if (p.getFirstName().equals("Maggie"))
   maggieFound = true;
  if (p.getFirstName().equals("Kayla"))
   kaylaFound = true;
  if (p.getFirstName().equals("Julia"))
   juliaFound = true;
 }

 assertTrue(maggieFound);
 assertTrue(kaylaFound);
 assertTrue(juliaFound);
}

  注意,对象数据库将尽量地使引用 “correct” — 至少在知道引用的情况下如此。例如,分别在两个不同的查询中检索一个 Person(也许是母亲)和检索另一个 Person(假设是女儿),仍然认为她们之间存在一个双向关系,如清单 7 所示。

  清单 7. 保持关系的真实性

@Test public void findJuliaAndHerMommy()
{
 Person maggie = (Person) db.get(
  new Person("Maggie", "Tate", Gender.FEMALE, 0, null)).next();
  Person julia = (Person) db.get(
   new Person("Julia", "Tate", Gender.FEMALE, 0, null)).next();

  assertTrue(julia.getMother() == maggie);
}

  当然,您正是希望对象数据库具有这样的行为。还应注意,如果返回女儿对象的查询的激活深度被设置得足够低,那么对 getMother() 的调用将返回 null,而不是实际的对象。这是因为 Person 中的 mother 字段是相对于被检索的原本对象的另一个 “跳跃(hop)”。(请参阅 前一篇文章,了解更多关于激活深度的信息。)

  更新和删除

  至此,您已经看到了 db4o 如何存储和取出多个对象,但是对象数据库如何处理更新和删除呢?就像结构化对象一样,多对象更新或删除期间的很多工作都与管理更新深度有关,或者与级联删除有关。现在您可能已经注意到,结构化对象与集合之间有很多相似之处,所以其中某一种实体的特性也适用于另一种实体。如果将 ArrayList 看作 “另一种结构化对象”,而不是一个集合,就很好理解了。

  所以,根据到目前为止您学到的东西,我应该可以更新数据库中的某一个女孩。而且,为了更新这个对象,只需将她父母中的一个重新存储到数据库中,如清单 8 所示。

  清单 8. 生日快乐,Kayla!

@Test public void kaylaHasABirthday()
{
 Person maggie = (Person) db.get(
  new Person("Maggie", "Tate", Gender.FEMALE, 0, null)).next();
 Person kayla = (Person) db.get(
   new Person("Kayla", "Tate", Gender.FEMALE, 0, null)).next();

 kayla.setAge(kayla.getAge() + 1);
 int kaylasNewAge = kayla.getAge();

 db.set(maggie);

 db.close();

 db = Db4o.openFile("persons.data");

 kayla = (Person) db.get(new Person("Kayla", "Tate", Gender.FEMALE, 0, null)).next();
 assert(kayla.getAge() == kaylasNewAge);
}

  还记得吗,在 前一篇文章 中,我必须显式地关闭到数据库的连接,以避免被误诊为重取已经位于工作内存中的对象。

  对于多样性关系中的对象,其删除工作非常类似于上一篇文章介绍索的结构化对象的删除工作。只需注意级联删除,因为它对这两种对象可能都有影响。当执行级联删除时,将会从引用对象的每个地方彻底删除对象。如果执行一个级联删除来从数据库中删除一个 Person,则那个 Person 的母亲和父亲在其 children 集合中突然有一个 null 引用,而不是有效的对象引用。

  结束语

  在很多方面,将数组和集合存储到对象数据库中并不总与存储常规的结构化对象不同,只是要注意数组不能被直接查询,而集合则可以。不管出于何种目的,这都意味着可以在建模时使用集合和数组,而不必等到持久引擎需要使用集合或数组时才使用它们。www.goodsgy.com

上一页  [1] [2] [3] 

在百度中搜索:面向Java程序员的db4o指南: 数组和集合
在Google中搜索:面向Java程序员的db4o指南: 数组和集合
在Yahoo中搜索:面向Java程序员的db4o指南: 数组和集合

收藏到网摘:新浪VIVI 365key 我摘 POCO网摘 博采中心 YouNote 和讯网摘 天天收藏
[] [返回上一页] [打 印] [收 藏]

 相关文章    最新文章
· 微软面向黑莓推出语音网络搜索软件
· Java中消除实现继承和面向接口编程
· 浅谈JavaScript中面向对象技术的模拟
· [组图] AJAX中JavaScript支持面向对象的基..
· 面向HTML6.0:W3C启动下一代Web语言
· 面向搜索引擎的网站设计
· PHP中实现面向对象编程
· 利用索引服务和ASP建立面向整个网站搜索程..
· 面向对象的asp编程之九---客户器端函数
· 面向对象的asp编程之八---服务器端函数
 
· 面向Java程序员的db4o指南: 数组和集合
· Java与.NET 谁才能主宰未来?
· Java编程技术中汉字问题的分析及解决
· Java 泛型的理解与等价实现
· 在Java中利用JCOM实现仿Excel编程详解
· [图文] Java小技巧:关于Cookie的操作
· Java中消除实现继承和面向接口编程
· Java实战篇:设计自己的Annotation
· 使用Java程序的泛型应该注意的几个地方
· JPCAP——Java中的数据链路层控制

∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论…]
站内搜索

精彩图文
  网站导航  
操作系统 办公软件 网络软件
Vista Windows2003 WindowsXP Windows2000/NT Windows9X/ME Linux 其他 Word Excel Powerpoint Outlook 金山系列 其他 网页浏览 上传下载 联络聊天 邮件工具 服务器软件 网络辅助
工具软件 媒体动画 网页制作
系统工具 媒体工具 压缩工具 图文处理 文件管理 其他 3DMAX Authorware Director Maya 视频处理 其他 Flash Dreamweaver FireWorks FrontPage LiveMotion Golive HTML/CSS 其它
网站开发 平面设计 程序设计
ASP JSP PHP CGI JavaScript VBScript XML/SOAP Web服务器 Photoshop PhotoImpact CorelDraw Illustrator Freehand 设计欣赏 其他 VB VC .NET C/C++ DELPHI JAVA

冀ICP备05019428号
Copyright © 2004-2008 电脑学习网 Inc.All rights reserved.
TEL:13832340607
QQ:39873155
E_Mail:goodsgy(#)hotmail.com   (把(#)替换成@)
MSN:goodsgy(#)hotmail.com   (把(#)替换成@)