使用 Morphia 和 MongoDB 实现域模型持久性(ZZ)
?
?图 1?中的统一建模语言(Unified Modeling Language,UML)显示了域模型类层次。左侧的矩形表示?Band
?类。右侧的矩形分别表示ContactInfo
、Distributor
?和?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
。
现在看一下?Song
、Distributor
?和?ContactInfo
?的类定义。清单 2 显示了?Song
?的定义:
这真是太棒了!它就在这里。除了?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());
????}
}???