Saltar al contenido

Extensión, expansión de tipo seguro e inyección de dependencia con el modelo de datos virtual para OData

¿Cuál es el tipo de extensión segura y ansiosa?

Hasta ahora, ha estado trabajando con BusinessPartner una entidad. Sin embargo, aquí está solo la entidad raíz de un modelo de datos más complejo. Por ejemplo, todos BusinessPartner cero se puede asociar con muchos BusinessPartnerAddresses que puede asociarse de nuevo con cero para muchos BusinessPartnerEMailAddresses. Otra asociación popular en el contexto de ERP son las relaciones de elementos de encabezado, como encabezados de facturas y artículos de línea de facturas.

Una posibilidad es considerar la vena perezosa de una entidad adjunta al usar la fetchXY() métodos que revelan cada caso. Para su socio comercial, puede encontrar las direcciones relacionadas con la siguiente línea de código:

List<BusinessPartnerAddress> addresses = businessPartner.fetchBusinessPartnerAddress();

Este puede ser un enfoque beneficioso en los casos en que las entidades contienen grandes cantidades de datos y la interacción con los datos permite una solución paso a paso del modelo (por ejemplo, entidades de carga diferida para la interfaz de usuario).

Si desea obtener direcciones de muchos socios comerciales, este enfoque genera problemas de rendimiento importantes porque cada llamada de modo responde a una única llamada de función en las API de S / 4HANA. Además, la recuperación diferida obtiene todos los campos de la entidad adjunta de forma predeterminada, sin embargo, a veces es posible que solo desee seleccionar ciertos campos.

En tales casos, será mejor que establezca la asociación con entusiasmo en la primera llamada a la API. I OData lenguaje, esto se llama una extensión de las propiedades de navegación, en SQL esto habla de un enlace externo izquierdo entre las tablas padre e hijo.

Cómo

En el siguiente ejemplo, presenta un ejemplo que amplía su lista de distribución conjunta para cada socio comercial, seguido de una proyección parcial de la City y Country propiedades de los relacionados BusinessPartnerAddress entidad, y otra extendida a la AddressEMailAddress entidad en la que proyecta sobre el EMail_Address propiedad solamente.

El archivo debe colocarse debajo de su <projectroot>/application/src/main/java/com/sap/cloud/sdk/tutorial directorio:

package com.sap.cloud.sdk.tutorial;

import com.sap.cloud.sdk.cloudplatform.connectivity.HttpDestination;
import com.sap.cloud.sdk.cloudplatform.resilience.ResilienceConfiguration;
import com.sap.cloud.sdk.cloudplatform.resilience.ResilienceDecorator;
import com.sap.cloud.sdk.cloudplatform.resilience.ResilienceRuntimeException;
import com.sap.cloud.sdk.odatav2.connectivity.ODataException;
import com.sap.cloud.sdk.s4hana.datamodel.odata.namespaces.businesspartner.BusinessPartner;
import com.sap.cloud.sdk.s4hana.datamodel.odata.namespaces.businesspartner.field.BusinessPartnerField;
import com.sap.cloud.sdk.s4hana.datamodel.odata.services.BusinessPartnerService;
import com.sap.cloud.sdk.s4hana.datamodel.odata.services.DefaultBusinessPartnerService;

import java.util.List;

public class GetBusinessPartnersCommand {

    private final BusinessPartnerService businessPartnerService;
    private final HttpDestination httpDestination;

    public GetBusinessPartnersCommand(HttpDestination destination) {
        this(destination, new DefaultBusinessPartnerService());
    }

    public GetBusinessPartnersCommand(HttpDestination httpDestination, BusinessPartnerService businessPartnerService) {
        this.businessPartnerService = businessPartnerService;
        this.httpDestination = httpDestination;
    }

    public List<BusinessPartner> execute() {
        return ResilienceDecorator.executeSupplier(this::run, ResilienceConfiguration.of(GetBusinessPartnersCommand.class));
    }

    private List<BusinessPartner> run() {
        try {
            return businessPartnerService.getAllBusinessPartner()
                    .filter(BusinessPartner.CUSTOMER.ne(""))
                    .select(BusinessPartner.FIRST_NAME,
                            BusinessPartner.LAST_NAME,
                            new BusinessPartnerField<String>("YY1_ApprovedBy_bus"),
                            new BusinessPartnerField<String>("YY1_ProposedBy_bus"))
                            BusinessPartner.TO_BUSINESS_PARTNER_ADDRESS
                                        .select(
                                                BusinessPartnerAddress.CITY_NAME,
                                                BusinessPartnerAddress.COUNTRY,
                                                BusinessPartnerAddress.TO_EMAIL_ADDRESS
                                                    .select(
                                                            AddressEmailAddress.EMAIL_ADDRESS
                                                    )
                                                )
                        )
                     .execute(httpDestination);
        } catch (ODataException e) {
            throw new ResilienceRuntimeException(e);
        }
    }
}

Sin más modificaciones, esto le dará inmediatamente a nuestro cliente el siguiente resultado en serie (pista: suponga que debe usar la versión original nuevamente BusinessPartner entidad de serialización para el cliente, no el MyBusinessPartner entidad)

Examen

Lectores familiarizados con OData el lenguaje de la pregunta puede ser sorprendente acerca de la sintaxis de expansión faltante (). Sa OData cuestionar, ampliar y seleccionar el idioma son dos palabras clave independientes.

Sa OData VDM para Java, decidimos combinar los dos métodos para mantener el principio de seguridad de tipos. Desafortunadamente, un sistema de tipos Java no es lo suficientemente poderoso como para preservar la información de tipos desde una declaración expandida explícita () a una declaración básica () seleccionada. La solución propuesta es la más adecuada para usar una API seleccionada con fluidez sobre entidades vinculadas para una API Java limpia y segura.

Trabajar con entidades extendidas

Después de una llamada API exitosa, es posible que desee trabajar con las colecciones de entidades relacionadas. Con este fin, el VDM proporciona dos métodos importantes en cada escenario de entidad que se pueden utilizar para la recuperación:

Primero el getOrFetch() method:

 List<BusinessPartnerAddress> businessPartnerAddresses = businessPartner.getBusinessPartnerAddressOrFetch();
 ```

 This method either returns the list of connected entities, if previously eagerly fetched or will lazily fetch the entities, if not. Therefore, this method guarantees to not return any null values but might break due to a thrown `ODataException`, in case a lazy fetch is initiated due to missing authorizations, timeouts or system unavailability.

Secondly, a `getOrNull()` method

Opcional> businessPartnerAddresses =
businessPartner.getBusinessPartnerAddressOrNull ();
»

Este método opcional envía el tipo de retorno que indica que la entidad conectada puede ser nula porque no se inicia una vena perezosa. Por lo tanto, este método no garantiza ninguna vena perezosa, pero no puede garantizar que devolverá valor. Como resultado, este método no consume ODataException.

Hecho

Inicie sesión para responder la pregunta