我通常在实例化查询对象时使用这种方法:

Query<Product> query = datastore.createQuery(Product.class);


但是,Morphia允许您在实例化查询对象时也传递集合名称,如下所示:

Query<Product> query = datastore.createQuery(COLLECTION_NAME, Product.class);


我无法理解为什么在创建查询对象时必须显式地传递Collection名称?

创建模型时,在这种情况下,在Product类中,我们已经在Entity注释下绑定了集合名称:

@Entity(value = "product", noClassnameStored = true)
class Product {
  // model attributes declared here
}


我能想到的一个原因是,如果在多个集合中使用相同的模型,那么我们可能需要传递集合名称,但是即使是这样,这也是一种好习惯并且遵守ORM准则吗?请帮助我理解。

最佳答案

该方法用于根据应用程序使用情况将一个实体存储在不同集合中的情况。它在AdvancedDatastore界面上是“隐藏的”,因此您在Datastore引用上应该看到的只是采用该类型的createQuery()。大多数用户不需要覆盖的表格,但它是几年前添加的,以方便需要映射到多个位置的用户使用。

这是一个轻度的错误,因为它不适用于@Reference字段。我不确定该功能将继续存在多久,因为它会使一些实现复杂化,而带来的收益却很小。

10-06 15:42
查看更多