首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

运用 Morphia 和 MongoDB 实现域模型持久性(ZZ)

2012-06-29 
使用 Morphia 和 MongoDB 实现域模型持久性(ZZ)??图 1?中的统一建模语言(Unified Modeling Language,UML)

使用 Morphia 和 MongoDB 实现域模型持久性(ZZ)

?

?

图 1?中的统一建模语言(Unified Modeling Language,UML)显示了域模型类层次。左侧的矩形表示?Band?类。右侧的矩形分别表示ContactInfoDistributor?和?Song?类。从?Band?指向?ContactInfo?的箭头在?ContactInfo?旁边标有一个 1,这说明两个类之间是一对一的关系。连接?Band?到?Distributor?的线在?Band?旁边标有 0..* 且在?Distributor?旁边标有一个 1,这说明?Band?具有单一的Distributor?且?Distributor?表示许多?Band。最后,从?Band?到?Song?的箭头在?Song?旁边标有目录 0..1,这说明?Band?具有与?Song?的一对多关系且这种关系被称作?catalog

我将对这些类进行注释,然后使用 Morphia 的?Datastore?接口在 MongoDB 上将它们保存为文档。


info?属性是另外一个嵌入的对象。在本例中,我通过?info?值明确地设置?@Embedded?注释。这会覆盖文档中子集的默认命名,否则就会被称为?contactInfo。例如:



正如?@Embedded?注释一样,@Reference?可以采用一个值来覆盖默认命名。在本例中,我将?songs?的?List?称为文档中的?catalog

现在看一下?SongDistributor?和?ContactInfo?的类定义。清单 2 显示了?Song?的定义:


清单 2. Song.java?

这真是太棒了!它就在这里。除了?className?字段以外,一切看起来正如您所期望的。Morphia 自动创建此字段以便记录 MongoDB 中的对象类型。其主要用于确定在编译时不必知道的对象类型(例如,在您从具有混合类型的集合中加载对象时)。如果这个困扰了您且您知道您不需要该功能,那么通过将?noClassnameStored?值添加到?@Entity?注释,您可以禁用持久保存?className


请注意?Song?还没有从?band?引用。我将它们添加到?band?并查看发生了什么:



现在,要避免此错误,您需要在删除歌曲以前手动删除对它的引用。

????????????????????+ m.getTime().toLocaleString());
????????}

????}

????public?void?getByObjectId()?throws?Exception {
????????Datastore ds = MeetingDaoTest.getDatastore();
????????ObjectId id =?new?ObjectId("4d019b0e82ea26c308eea127");
????????Meeting m = ds.get(Meeting.class, id);
????????System.out.println(m.getTitle());
????}

}???

热点排行