Einschränkungen und Ausnahmen für über Container realisierte Transaktionspersistenz (CMP)
Die CMP-Features können durch bestimmte externe Software, die direkte Auswirkungen auf Ihre Anwendungen hat, eingeschränkt werden. Allerdings können Sie diese Einschränkungen umgehen.
In jedem Fall werden CMP-Beans nur durch sehr spezielle Verhaltensweisen der Software eingeschärnkt. Die folgenden Tipps helfen Ihnen, diese Verhalten zu verhindern.
Einschränkung bezüglich der Implementierung von CMP und des Sybase-Datentyps IMAGE
Wenn Sie Enterprise-Beans mit nicht primitiven CMP-Typen implementieren, die keine natürliche JDBC-Zuordnung besitzen, ordnet das Implementierungstool den CMP-Typ in der Datenbank, in der der Typ als serialisierte Instanz gespeichert ist, einem Binärtyp zu. Für Sybase verwendet das Tool den JDBC-Typ LONG VARBINARY. Der Sybase-Treiber ordnet LONG VARBINARY dem nativen Type IMAGE zu.
Obwohl bezüglich des Typs VARBINARY weniger Einschränkungen als IMAGE in Sybase gelten, können Sie diesen Typ nicht verwenden, weil er auf eine Größe von 255 Bytes beschränkt ist. Dies ist für typische serialisierte Java™-Objekte zu klein.
- Sie können den Typ IMAGE nicht in der WHERE-Klausel einer SQL-Abfrage verwenden. Auf diese Einschränkung stoßen Sie, wenn eine Enterprise-Bean eine EJB-QL-Abfrage mit einem CMP-Typ in der WHERE-Klausel enthält, die dem Typ IMAGE in der relationalen Sybase-Datenbank zugeordnet ist.
- Sie können den Typ IMAGE nicht in Select-Abfragen verwenden, die mit DISTINCT
gekennzeichnet sind. Dieser Fall tritt in den folgenden Benutzerszenarios auf:
- wenn das Schlüsselwort DISTINCT in einer EJB-QL-Select-Abfrage angegeben ist, die einen Java-Typ hat, der dem Typ IMAGE zugeordnet ist.
- Wenn in Enterprise-Beans Finder- und ejbSelect()-Methoden definiert sind, die java.util zurückgeben. Legen Sie CMP-Typen fest, die dem Typ IMAGE zugeordnet sind.
- Wenn Sie sicher sind, dass die serialisierte Instanz des CMP-Typs niemals größer ist als 255 Bytes, können Sie die CMP-Typ-Zuordnung von IMAGE oder LONG VARBINARY in VARBINARY ändern.
- Den CMP-Typ mit einem Composer mehreren RDB-Feldern zuordnen. Wenn der CMP-Typ beispielsweise ein Java-Objekt X mit einem Integer-Feld und einem Zeichenfolgefeld ist, ordnen Sie X mit einem Composer den beiden RDB-Feldern INTEGER und VARCHAR zu. Nähere Informationen zur Verwendung von Composern finden Sie in der Dokumentation von Rational Application Developer.
Die Ausnahme ClassCastException wird bei Ausführung von CMP-1.1-Beans ausgelöst.

Die von Rational Application Developer oder WebSphere Studio Application Developer Integration Edition Version 4.0.x generierte Cast-Operation verwendet nicht das Objekt javax.rmi.PortableRemoteObject.narrow(...) um das ferne Objekt in die ferne Schnittstelle für CMP-Beans in der Klasse XToYLink.java (oder YToXLink.java) zu konvertieren (X und Y stehen für CMP-Beans der Version 1.1).
Empfohlene Maßnahme:
- Suchen Sie die folgenden Methoden in allen Verbindungsklassen, z. B. XToYLink.java
und YToXLink.java (X und Y sind CMP-Beans der Version 1.1):
public void secondaryAddElementCounterLinkOf(javax.ejb.EJBObject anEJB) public void secondaryRemoveElementCounterLinkOf(javax.ejb.EJBObject anEJB) public void secondarySetCounterLinkOf(javax.ejb.EJBObject anEJB)
- Fügen Sie das Objekt javax.rmi.PortableRemoteObject.narrow(...) hinzu, um das ferne Objekt in die ferne Schnittstelle für CMP-Beans zu konvertieren.
public void secondaryAddElementCounterLinkOf(javax.ejb.EJBObject anEJB) throws java.rmi.RemoteException {
if (anEJB != null)
((X) anEJB).secondaryAddY((Y) getEntityContext().getEJBObject());
in: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));