Extension du modèle d'objet HCL Commerce avec des beans de session
HCL Commerce a mis en œuvre des objets métier de base à l'aide d'entités JPA.
Il existe cependant des situations dans lesquelles il est recommandé d'utiliser un assistant JDBC de bean de session. On retrouve parmi elles les situations suivantes :
- Cas où une requête renvoie un ensemble de résultats important. C'est ce qu'on appelle le cas large result set.
- Cas où une requête récupère des données de plusieurs tables. C'est ce qu'on appelle l'aggregate entity case.
- Cas où une instruction SQL effectue une opération intensive de base de données. C'est ce qu'on appelle le cas arbitrary SQL.
Plus de détails sont fournis dans les sections suivantes.
Notez que si le bean de session est utilisé comme un encapsuleur JDBC pour récupérer des informations à partir de la base de données, il devient plus difficile d'implémenter le contrôle d'accès au niveau de la ressources. Lorsqu'un bean de session est utilisé de cette manière, le développeur du bean de session doit ajouter les clauses "where" appropriées à l'instruction "select" afin d'empêcher les utilisateurs non autorisés d'accéder aux ressources.
Cas d'un ensemble de résultats important
Il existe des cas où une requête renvoie un important ensemble de résultats et où les données récupérées ont principalement des fins de lecture ou d'affichage. Dans ce cas, il est préférable d'utiliser un bean de session sans état et, dans ce bean de session, de créer une méthode de recherche qui exécute les mêmes fonctions qu'une méthode de recherche dans un bean d'entité. Autrement dit, la méthode de recherche du bean de session sans état doit faire ce qui suit :
- Effectuer une instruction de sélection SQL
- Pour chaque ligne récupérée, instancier un bean d'accès
- Pour chaque colonne récupérée, définir les attributs correspondants dans le bean d'accès
Lorsque le bean d'accès est renvoyé, la commande ignore si le bean d'accès a été renvoyé par une méthode de recherche dans un bean de session ou à partir d'une méthode de recherche dans un bean d'entité. Par conséquent, l'utilisation d'une méthode de recherche dans un bean de session ne cause aucun changement au modèle de programmation. Seule la commande d'appel est consciente qu'elle appelle une méthode de recherche dans un bean de session ou dans un bean d'entité. Cela est transparent pour toutes les autres parties du modèle de programmation.
Cas d'une entité agrégée
Dans ce cas, une vue combine des parties de plusieurs objets et une seule page d'affichage est remplie d'informations provenant de plusieurs tables de base de données. Prenons par exemple le concept de "Mon compte". Il peut s'agir d'informations provenant d'une table d'informations client (par exemple, le nom, l'âge et l'identificateur du client) et d'informations provenant d'une table d'adresses (par exemple, une adresse composée d'une rue et d'une ville).
Il est possible de créer une instruction SQL simple pour récupérer toutes les informations des différentes tables en effectuant une jointure SQL. On peut appeler cela l'exécution d'une "extraction en profondeur". Voici un exemple d'instruction de sélection SQL pour l'exemple "Mon compte", où la table CUSTOMER est la T1 et la table ADDRESS est la T2 :
select T1.NAME, T1.AGE, T2.STREET, T2.CITY
from CUSTOMER T1, ADDRESS T2
where (T1.ID=? and T1.ID=T2.ID)
Afin d'effectuer une extraction en profondeur, il est recommandé que vous utilisiez un bean de session. Dans ce bean de session, créez une méthode de recherche pour récupérer les informations requises. La méthode de recherche doit effectuer les opérations suivantes :
- Effectuer une instruction de sélection SQL pour l'extraction profonde
- Instancier un bean pour chaque ligne de la table principale ainsi que pour chaque objet associé
- Pour chaque colonne extraite et pour chaque objet associé extrait, définissez l'attribut correspondant dans le bean d'accès
Notez qu'un bean d'accès ne met pas en cache une méthode getter qui renvoie un autre bean d'accès. Dans ce cas, vous devez créer une classe d'encapsulage simple pour le bean d'accès à l'aide du modèle suivant :
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;
}
}
Dans la continuité de l'exemple CUSTOMER et ADDRESS, la méthode de recherche de bean de session instancie un CustomerAccessBean pour chaque ligne de la table CUSTOMER et un AddressAccessBean pour chaque ligne correspondante dans la table ADDRESS. Ensuite, pour chaque colonne de la table ADDRESS, elle définirait les attributs de l'AddressAccessBean (rue et ville) ; pour chaque colonne de la table CUSTOMER, elle définirait les attributs du CustomerAccessBean (nom, âge et adresse). Ceci est illustré dans le diagramme suivant.
Cas SQL arbitraire
Dans ce cas, il existe un ensemble d'instructions SQL arbitraires qui exécutent des opérations de base de données intensives. Par exemple, l'opération de somme de toutes les lignes d'un tableau serait considérée comme une opération de base de données intensive. Il est possible que toutes les lignes sélectionnées ne correspondent pas à un bean d'entité dans le modèle persistant.
Exemple qui pourrait entraîner la création d'une instruction SQL arbitraire : lorsque le client tente de parcourir un très grand ensemble de données. Par exemple, si le client voulait examiner toutes les attaches dans une quincaillerie en ligne, ou toutes les robes d'un magasin de vêtements en ligne. Cela crée un ensemble de résultats très important, mais dans cet ensemble de résultats, il est très probable que seuls quelques champs de chaque ligne soient nécessaires. Autrement dit, le client peut ne voir initialement qu'un résumé indiquant le nom, l'image et le prix de l'article.
Dans ce cas, créez une méthode d'aide aux beans de session. Cette méthode d'aide aux beans de session effectue une opération de lecture ou d'écriture. Lors de l'exécution d'une opération de lecture, elle renvoie un objet de valeur en lecture seule utilisé à des fins d'affichage.
Grâce à une modélisation des données appropriée, le nombre de cas d'instructions SQL arbitraires peut généralement être réduit au minimum.