¿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)
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
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
.