Restrictions et exceptions CMP
Certains logiciels externes ayant un impact direct sur vos applications peuvent limiter les fonctions de persistance gérée par conteneur (CMP). Cependant, il existe des solutions de contournement.
Dans tous les cas, seuls certains comportements spécifiques des logiciels imposent des restrictions à vos beans CMP. Les conseils suivants vous aideront à éviter ces comportements.
Restriction en matière de déploiement CMP et de type IMAGE dans Sybase
Si vous déployez des beans enterprise avec des types CMP (persistance gérée par conteneur) non primitifs et non pourvus d'un mappage naturel JDBC, l'outil de déploiement mappe le type CMP sur un type binaire de la base de données dans laquelle il est stocké en tant qu'instance sérialisée. Pour Sybase, l'outil emploie le type JDBC LONG VARBINARY. Le pilote Sybase associe LONG VARBINARY au type natif IMAGE.
Bien que le type VARBINARY soit moins restrictif que le type IMAGE dans Sybase, vous ne pouvez pas l'utiliser car il est limité à une taille de 255 octets, ce qui est trop peu pour des objets sérialisés Java™ types.
- Vous ne pouvez pas utiliser le type IMAGE dans la clause WHERE d'une requête SQL. Vous rencontrerez cette restriction chaque fois qu'un bean enterprise contiendra une requête EJB-QL dont la clause WHERE comporte le type CMP. Cette clause est mappée sur le type IMAGE dans la base de données relationnelle Sybase.
- Vous ne pouvez pas utiliser le type IMAGE dans des requêtes select marquées DISTINCT.
Cette situation
survient dans les scénarios utilisateur suivants :
- Lorsque le mot-clé DISTINCT est spécifié dans une requête EJB-QL select dotée d'un type Java mappé sur IMAGE.
- Lorsque les méthodes finder et ejbSelect() des beans enterprise renvoient java.util. Définissez les types CMP et mappez-les sur IMAGE.
- Si vous êtes certain que la taille de l'instance sérialisée du type CMP n'est jamais supérieure à 255 octets, vous pouvez modifier le mappage des types CMP en remplaçant IMAGE ou LONG VARBINARY parVARBINARY.
- Mappez le type CMP sur plusieurs zones RDB via un composeur. Par exemple, si le type CMP est un objet Java X avec une zone int et une zone string, mappez X sur deux zones RDB, INTEGER et VARCHAR, à l'aide d'un composeur. Reportez-vous à la documentation de Rational Application Developer pour plus détails concernant l'utilisation des composeurs.
Une exception ClassCastException se produit lors de l'exécution de beans CMP version 1.1.

Cette opération de transtypage générée par Rational Application Developer ou WebSphere Studio Application Developer Integration Edition version 4.0.x, n'utilise pas l'objet javax.rmi.PortableRemoteObject.narrow(...) pour convertir l'objet éloigné en interface Remote des beans CMP dans la classe XToYLink.java (ou YToXLink.java) où X et Y sont des beans CMP 1.1.
Solution recommandée :
- Recherchez les méthodes suivantes dans toutes les classes de liens, par exemple, XToYLink.java et YToXLink.java, où X et Y sont des beans CMP 1.1 :
public void secondaryAddElementCounterLinkOf(javax.ejb.EJBObject anEJB) public void secondaryRemoveElementCounterLinkOf(javax.ejb.EJBObject anEJB) public void secondarySetCounterLinkOf(javax.ejb.EJBObject anEJB)
- Ajoutez l'objet javax.rmi.PortableRemoteObject.narrow(...) pour convertir l'objet éloigné en interface Remote des beans CMP.
public void secondaryAddElementCounterLinkOf(javax.ejb.EJBObject anEJB) throws java.rmi.RemoteException {
if (anEJB != null)
((X) anEJB).secondaryAddY((Y) getEntityContext().getEJBObject());
en :
public void secondaryAddElementCounterLinkOf(javax.ejb.EJBObject anEJB) throws java.rmi.RemoteException {
if (anEJB != null)
((X) anEJB).secondaryAddY((Y)
javax.rmi.PortableRemoteObject.narrow(getEntityContext().getEJBObject(), Y.class));