容器管理的持久性限制和异常
某些直接影响应用程序的外部软件可能会限制容器管理的持久性 (CMP) 功能。但是,您可以解决这些局限性。
在每种情况下,只有非常具体的软件行为会对 CMP Bean 进行限制。下列提示有助于您防止这些行为。
CMP 部署和 Sybase IMAGE 类型限制
当通过容器管理的持久性 (CMP) 类型(非原始的并且没有自然 JDBC 映射)部署企业 Bean 时,部署工具在数据库中将 CMP 类型映射为二进制类型,在该数据库中 CMP 类型是以序列化实例存储的。对于 Sybase,此工具使用 JDBC 类型 LONG VARBINARY。Sybase 驱动程序将 LONG VARBINARY 映射为本地类型 IMAGE。
虽然类型 VARBINARY 比 Sybase 中 IMAGE 限制少,但是您无法使用它,因为它的大小被限制为 255 个字节,这对于典型序列化的 Java™ 对象而言太小。
IMAGE 类型的特定限制是:
- 您不可以在 SQL 查询的 WHERE 子句中使用 IMAGE 类型。每当企业 Bean 包含在 WHERE 子句中具有 CMP 类型的 EJB-QL 查询时您就会受到此限制,该 CMP 类型在 Sybase 关系数据库中映射至 IMAGE 类型。
- 您不可以在标记为 DISTINCT 的选择查询中使用 IMAGE 类型。在以下这些用户方案中会出现此情况:
- 当在 Java 类型映射为 IMAGE 的 EJB-QL 选择查询中指定 DISTINCT 关键字时。
- 当企业 Bean 使 finder 方法和 ejbSelect() 方法返回 java.util 时。设置并将 CMP 类型映射为 IMAGE。
要解决此限制,请在 Rational® Application
Developer 工具集中编辑 EJB 映射,并执行以下某个操作:
- 如果您确信 CMP 类型的序列化实例从不大于 255 个字节,那么可以将 CMP 类型映射从 IMAGE 或 LONG VARBINARY 更改为 VARBINARY。
- 通过组合器将 CMP 类型映射至多个 RDB 字段。例如,如果 CMP 类型是具有 int 字段和 string 字段的 Java 对象 X,那么使用组合器将 X 映射成两个 RDB 字段:INTEGER 和 VARCHAR。请参阅 Rational Application Developer 文档,以获取关于使用组合器的更多信息。
运行 CMP 1.1 Bean 时,会发生 ClassCastException 异常
如果您使用 Rational Application Developer 或 WebSphere® Studio Application
Developer Integration Edition V4.0.x 创建 Enterprise JavaBeans (EJB) 应用程序,并且应用程序包含具有关联(关系)的容器管理的
持久性 (CMP) 1.1 bean,那么当在 WebSphere Application Server 上运行应用程序时,可能会收到 java.lang.ClassCastException 异常。
不推荐使用的功能部件: 不推荐使用 WebSphere Studio Application
Developer Integration Edition V5.0 或更早版本建模的业务流程。depfeat

将远程对象转换为 XToYLink.java(或 YToXLink.java)类中的 CMP Bean 的远程接口(其中 X 和 Y 是 CMP 1.1 bean)时,Rational Application Developer 或 WebSphere Studio Application Developer Integration Edition V4.0.x 生成的强制类型转换操作不使用 javax.rmi.PortableRemoteObject.narrow(...) 对象。
建议的响应:
- 请在所有链接类例如 XToYLink.java 和 YToXLink.java(其中 X 和 Y 是 CMP 1.1 bean)中查找下列方法:
public void secondaryAddElementCounterLinkOf(javax.ejb.EJBObject anEJB) public void secondaryRemoveElementCounterLinkOf(javax.ejb.EJBObject anEJB) public void secondarySetCounterLinkOf(javax.ejb.EJBObject anEJB)
- 添加 javax.rmi.PortableRemoteObject.narrow(...) 对象将远程对象转换为 CMP Bean 的远程接口。
例如,将以下最初的方法:
public void secondaryAddElementCounterLinkOf(javax.ejb.EJBObject anEJB) throws java.rmi.RemoteException {
if (anEJB != null)
((X) anEJB).secondaryAddY((Y) getEntityContext().getEJBObject());
更改为: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));