Restrições e Exceções de Container-Managed Persistence
Algum software externo que causa impacto diretamente em seus aplicativos pode limitar os recursos de CMP (Container-Managed Persistence). No entanto, é possível solucionar essas limitações.
Em cada caso, apenas os comportamentos muito específicos das restrições de local de software em seus beans de CMP. As dicas a seguir o ajudarão a evitar esses comportamentos.
Restrição de Implementação de CMP e de Tipo de IMAGEM do Sybase
Ao implementar beans corporativos com tipos CMP (Container Managed Persistence) que não são primitivos e não possuem um mapeamento natural do JDBC, a ferramenta de implementação mapeia o tipo CMP para um tipo binário no banco de dados no qual ele é armazenado como uma instância serializada. Para o Sybase, a ferramenta utiliza o tipo JDBC LONG VARBINARY. O driver do Sybase mapeia LONG VARBINARY para o tipo nativo IMAGE.
Embora o tipo VARBINARY tenha menos restrições do que IMAGE no Sybase, você não pode utilizá-lo porque ele está limitado a um tamanho de 255 bytes, o que é muito pouco para objetos Java™ serializados típicos.
- Você não pode utilizar o tipo IMAGE na cláusula WHERE de uma consulta SQL. Você pode encontrar essa restrição sempre que um enterprise bean contiver uma consulta EJB-QL que tenha um tipo CMP na cláusula WHERE, que mapeia para o tipo IMAGE no banco de dados relacional Sybase.
- Você não pode utilizar o tipo IMAGE em consultas selecionadas marcadas DISTINCT.
Essa situação
ocorre nestes cenários do usuário:
- Quando a palavra-chave DISTINCT é especificada em uma consulta de seleção EJB-QL tendo um mapeamento do tipo Java para IMAGE.
- Quando os beans corporativos têm métodos finder e ejbSelect() retornando java.util. Defina e tenha tipos CMP mapeados para IMAGE.
- Se você tiver certeza de que a instância serializada do tipo CMP nunca é maior do que 255 bytes, poderá alterar o mapeamento do tipo CMP de IMAGE ou LONG VARBINARY para VARBINARY.
- Mapeie o tipo CMP para vários campos RDB por meio de um compositor. Por exemplo, se o tipo CMP for um objeto Java X com um campo int e um campo de cadeia, mapeie X para os dois campos RDB, INTEGER e VARCHAR, utilizando um criador. Consulte a documentação do Rational Application Developer para obter mais informações sobre o uso de criadores.
Ocorre uma Exceção ClassCastException ao Executar os Beans CMP 1.1

A operação de lançamento gerada pelo Rational Application Developer ou pelo WebSphere Studio Application Developer Integration Edition, Versão 4.0.x, não utiliza o objeto javax.rmi.PortableRemoteObject.narrow(...) para converter o objeto remoto para a interface remota de beans CMP na classe XToYLink.java (ou YToXLink.java), em que X e Y são beans CMP 1.1.
Resposta Recomendada:
- Localize os métodos a seguir em todas as classes de link, por exemplo, XToYLink.java
e YToXLink.java, em que X e Y são 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)
- Inclua o objeto javax.rmi.PortableRemoteObject.narrow(...) para converter o objeto remoto na interface remota de beans CMP.
public void secondaryAddElementCounterLinkOf(javax.ejb.EJBObject anEJB) throws java.rmi.RemoteException {
if (anEJB != null)
((X) anEJB).secondaryAddY((Y) getEntityContext().getEJBObject());
para:
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));