Olingo:EntityContainer和EntitySets的差异

时间:2017-11-14 20:26:16

标签: odata olingo

我正在阅读此documentation以了解如何创建odata服务。

我不太清楚EntityContainerEntitySet是什么......

[编辑]

我想问一个误解,我还没弄清楚。如果EntitySet直截了当是一组实体:

为什么我需要在OData提供程序上实现EntitySet CsdlAbstractEdmProvider.getEntitySet()方法?正如您在here上看到的,我需要实现返回EntitySet的方法。这是Olingo文档的实现:

public CsdlEntitySet getEntitySet(FullQualifiedName entityContainer, String entitySetName) {

  if(entityContainer.equals(CONTAINER)){
    if(entitySetName.equals(ES_PRODUCTS_NAME)){
      CsdlEntitySet entitySet = new CsdlEntitySet();
      entitySet.setName(ES_PRODUCTS_NAME);
      entitySet.setType(ET_PRODUCT_FQN);

      return entitySet;
    }
  }

  return null;
}

我不太明白这个实现是什么。

另一方面,在EntityCollectionProcessor documentation implementation,您可以看到他们也在使用EntitySet

我不明白提供商内部和处理器内部EntitySet之间的区别是什么。

我不知道我是否已经解释得很好

1 个答案:

答案 0 :(得分:2)

基于OData documentation,第4.1节:

  

EDM的核心概念是实体和协会。 实体是实体类型的实例(例如,客户,员工等),它们是由命名和类型属性以及密钥组成的结构化记录。复杂类型是结构化类型,也包含属性列表但没有键,因此只能作为包含实体的属性或作为临时值存在。实体密钥由实体类型的属性子集形成。实体密钥(例如,CustomerId或OrderId)是唯一标识实体类型实例并允许实体类型实例参与关系的基本概念。 实体在实体集中分组(例如,客户是一组客户实体类型实例)。

     

关联定义两个或多个实体类型之间的关系(例如,Employee WorksFor Department)。关联实例在关联集中分组。导航属性是实体类型的特殊属性,它们绑定到特定关联,可用于引用实体的关联。

     

最后,所有实例容器(实体集和关联集)都分组在实体容器中。

要点:

  • EntitySet 是一组实体。通常,EntitySet是业务对象;要使用关系数据库比较,请将EntitySet视为表,将实体视为该表中的行。
  • EntityContainer 正是EntitySets和Associations的容器。粗略地说,您可以将其视为包含表格,视图等的数据库。

希望这有帮助。

编辑,跟随您的问题更改:

Provider.getEntitySet()方法与 Processor.getEntitySet()之间的区别归结为Provider和Processor类的目的不同。< / p>

  • Provider类定义OData服务的结构和元数据。 getEntitySet 方法定义每个实体集的结构(名称和类型)。
  • 处理器类本质上是OData服务的servlet。在这里,HTTP请求被解析,处理和重定向(到您的服务或DAO层)。处理器中的 getEntitySet 方法用于处理此结构的请求:(主机和端口)/(服务root.svc)/(MyEntitySet),例如: http://services.odata.org/V3/Northwind/Northwind.svc/Customers 。在此方法中,确定要求的实体集,然后调用DAO以相应地获取数据。