Ampliar el modelo de objeto de HCL Commerce con beans de sesión

HCL Commerce ha implementado objetos centrales de comercio utilizando entidades JPA.

Sin embargo, hay situaciones en las que se recomienda utilizar una ayuda JDBC de bean de sesión. Estas situaciones incluyen lo siguiente:

  • Un caso en el que una consulta devuelve un conjunto de resultados muy extenso. Este caso se denomina large result set.
  • Un caso en el que una consulta recupera datos de varias tablas. Esto se denomina aggregate entity case.
  • Un caso en el que una sentencia SQL realiza una operación intensiva de base de datos. Esto se denomina caso arbitrary SQL.

En las secciones siguientes se proporcionan más detalles.

Tenga en cuenta que si el bean de sesión se utiliza como wrapper JDBC para recuperar información de la base de datos, será más difícil implementar control de acceso a nivel de recurso. Cuando se utiliza un bean de sesión de esta forma, el desarrollador del bean de sesión debe añadir la cláusula "where" en la sentencia "select" para impedir que usuarios no autorizados puedan acceder a los recursos.

Conjunto de resultados extenso

Hay casos en los que una consulta devuelve un gran número de resultados y los datos recuperados son para lectura o para que se visualicen. En este caso, es mejor utilizar un bean de sesión sin estado y, dentro de este bean, crear un método buscador que efectúe las mismas funciones que un método buscador en un bean de entidad. Es decir, el método buscador en el bean de sesión sin estado debe hacer lo siguiente:

  • Ejecutar una sentencia select de SQL
  • Para cada fila que se busca, crear una instancia de un bean de acceso
  • Para cada columna recuperada, establecer los atributos correspondientes en el bean de acceso

Cuando se devuelve el bean de acceso, el mandato no sabe si el bean de acceso lo ha devuelto un método buscador en un bean de sesión o un método buscador en un bean de entidad. Como resultado, al utilizar un método buscador en un bean de sesión no se efectúa ningún cambio en el modelo de programación. Solo el mandato que llama sabe si está invocando un método buscador en un bean de sesión o en un bean de entidad. Es transparente a todas las demás partes del modelo de programación.

Entidad agregada

En este caso, una vista combina partes de varios objetos y una sola página de visualización se rellena con información proveniente de varias tablas de base de datos. Por ejemplo, tomemos el concepto de "Mi cuenta". Este puede constar de información de la tabla de información de cliente (por ejemplo, el nombre de cliente, la edad y el ID de cliente) e información de una tabla de dirección (por ejemplo, una dirección que consta de una calle y una ciudad).

Es posible crear una sentencia SQL sencilla para recuperar toda la información de las diversas tablas ejecutando una función join de SQL. A esto se le puede denominar "recopilación detallada". A continuación se muestra un ejemplo de una sentencia select de SQL para el ejemplo "Mi cuenta", donde la tabla CUSTOMER es T1 y la tabla ADDRESS es T2:


select T1.NAME, T1.AGE, T2.STREET, T2.CITY
  from CUSTOMER T1, ADDRESS T2
  where (T1.ID=? and T1.ID=T2.ID)

Para efectuar una recopilación detallada se recomienda que utilice un bean de sesión. En ese bean de sesión, debe crear un método buscador para recuperar la información requerida. El método buscador debe hacer lo siguiente:

  • Ejecutar una sentencia select de SQL para la recopilación detallada
  • Crear una instancia de un bean de acceso para cada fila en la tabla principal así como para cada objeto asociado.
  • Para cada columna y objeto asociado en que se busca, establezca el atributo correspondiente en el bean de acceso.

Tenga en cuenta que un bean de acceso no almacena en memoria caché un método get que devuelve otro bean de acceso. En ese caso, debe crear una clase de wrapper simple para el bean de acceso utilizando el siguiente esquema:


public class CustomerAccessBeanCopy extends CustomerAccessBean {
   private AddressAccessBean address=null;

   /* The following method overrides the getAddress method in 
      the CustomerAccessBean.
   */
   public AddressAccessBean getAddress() {
      if (address == null)
         address = super.getAddress();
      return address;
      }

    /* The following method sets the address to the copy. */

    public void _setAddress(AddressAccessBean aBean) {
       address = aBean;
      }
} 

Siguiendo con el ejemplo de CUSTOMER y ADDRESS, el método buscador del bean de sesión creará una instancia de CustomerAccessBean para cada fila de la tabla CUSTOMER y un AddressAccessBean para cada fila correspondiente de la tabla ADDRESS. A continuación, para cada columna de la tabla ADDRESS, establece los atributos en AddressAccessBean (calle y ciudad). Para cada columna de la tabla ADDRESS, establece los atributos en CustomerAccessBean (nombre, edad y dirección). Esto se muestra en el siguiente diagrama:

Diagrama que muestra el flujo de información desde AddressAccessBean a CustomerAccessBean a través del método _setAddress, como se describe en el párrafo anterior.

SQL arbitrario

En este caso, hay un conjunto de sentencias SQL arbitrarias que efectúan operaciones intensivas de base de datos. Por ejemplo, la operación de sumar todas las filas de una tabla se consideraría una operación intensiva de base de datos. Es posible que no todas las filas seleccionadas correspondan a un bean de entidad en el modelo persistente.

Un ejemplo que podría dar como resultado la creación de una sentencia SQL arbitraria es cuando un cliente intenta navegar a través de un conjunto grande de datos. Por ejemplo, cuando el cliente quiere examinar todos los tornillos en una ferretería en línea o todos los vestidos en una tienda de ropa en línea. Esto crea un conjunto de resultados muy grande, pero aparte de este conjunto de resultados, es muy probable que solo se necesiten unos cuantos campos de cada fila. Es decir, al cliente inicialmente quizá solo se le presente un resumen mostrando el nombre del artículo, el gráfico y el precio.

En este caso, cree un método de ayuda de bean de sesión. Este método de ayuda de bean de sesión efectúa una operación de lectura o de grabación. Al efectuar una operación de lectura, devuelve un objeto de valor de solo lectura que se utiliza para visualización.

Generalmente, si se modelan correctamente los datos se minimiza el número de casos de sentencias SQL arbitrarias.