CMP having a compound PK with only one fields are not supported
---------------------------------------------------------------

         Key: GERONIMO-1361
         URL: http://issues.apache.org/jira/browse/GERONIMO-1361
     Project: Geronimo
        Type: Bug
  Components: OpenEJB  
    Versions: 1.0-M5    
    Reporter: Gianny Damour
 Assigned to: Gianny Damour 
    Priority: Minor
     Fix For: 1.0


I have replicated the issue in a simple EJB,the example CMP in Ed Roman's book 
Mastering EJB. I am attaching the stack trace and the plans below

17:02:05,211 WARN  [SystemExceptionInterceptor] Product
java.lang.ClassCastException
        at 
org.tranql.sql.jdbc.binding.StringBinding.setValue(StringBinding.java:43)
        at 
org.tranql.sql.jdbc.binding.TypeConverterBinding.setValue(TypeConverterBinding.java:93)
        at 
org.tranql.sql.jdbc.binding.TypeConverterBinding.setValue(TypeConverterBinding.java:89)
        at 
org.tranql.sql.jdbc.JDBCQueryCommand.execute(JDBCQueryCommand.java:64)
        at 
org.tranql.cache.cache.FindByPKCacheQueryCommand.execute(FindByPKCacheQueryCommand.java:6
6)
        at org.openejb.entity.cmp.CMPFinder.execute(CMPFinder.java:98)
        at 
org.openejb.entity.cmp.SingleValuedFinder.execute(SingleValuedFinder.java:80)
        at 
org.openejb.dispatch.DispatchInterceptor.invoke(DispatchInterceptor.java:72)
        at 
org.apache.geronimo.naming.java.ComponentContextInterceptor.invoke(ComponentContextInterc
eptor.java:56)
        at 
org.openejb.ConnectionTrackingInterceptor.invoke(ConnectionTrackingInterceptor.java:81)
        at 
org.openejb.entity.EntityInstanceInterceptor.invoke(EntityInstanceInterceptor.java:136)
        at 
org.openejb.entity.cmp.InTxCacheInterceptor.invoke(InTxCacheInterceptor.java:90)
        at 
org.openejb.transaction.ContainerPolicy$TxRequired.invoke(ContainerPolicy.java:140)
        at 
org.openejb.transaction.TransactionContextInterceptor.invoke(TransactionContextIntercepto
r.java:80)
        at 
org.openejb.SystemExceptionInterceptor.invoke(SystemExceptionInterceptor.java:82)
        at org.openejb.GenericEJBContainer.invoke(GenericEJBContainer.java:238)
        at 
org.openejb.server.ejbd.EjbRequestHandler.invoke(EjbRequestHandler.java:297)
        at 
org.openejb.server.ejbd.EjbRequestHandler.doEjbHome_FIND(EjbRequestHandler.java:394)
        at 
org.openejb.server.ejbd.EjbRequestHandler.processRequest(EjbRequestHandler.java:209)
        at org.openejb.server.ejbd.EjbDaemon.service(EjbDaemon.java:150)
        at org.openejb.server.ejbd.EjbServer.service(EjbServer.java:87)
        at 
org.openejb.server.ejbd.EjbServer$$FastClassByCGLIB$$d379d2ff.invoke(<generated>)
        at net.sf.cglib.reflect.FastMethod.invoke(FastMethod.java:53)
        at 
org.apache.geronimo.gbean.runtime.FastMethodInvoker.invoke(FastMethodInvoker.java:38)
        at 
org.apache.geronimo.gbean.runtime.GBeanOperation.invoke(GBeanOperation.java:118)
        at 
org.apache.geronimo.gbean.runtime.GBeanInstance.invoke(GBeanInstance.java:800)
        at 
org.apache.geronimo.gbean.runtime.RawInvoker.invoke(RawInvoker.java:57)
        at 
org.apache.geronimo.kernel.basic.RawOperationInvoker.invoke(RawOperationInvoker.java:36)
        at 
org.apache.geronimo.kernel.basic.ProxyMethodInterceptor.intercept(ProxyMethodInterceptor.
java:96)
        at 
org.activeio.xnet.ServerService$$EnhancerByCGLIB$$e80ad14.service(<generated>)
        at org.activeio.xnet.ServicePool$2.run(ServicePool.java:67)
        at org.activeio.xnet.ServicePool$3.run(ServicePool.java:90)
        at 
org.apache.geronimo.pool.ThreadPool$ContextClassLoaderRunnable.run(ThreadPool.java:138)
        at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(Unknown 
Source)
        at java.lang.Thread.run(Unknown Source)
setEntityContext called
ejbActivate() called.
ejbLoad() called.

ejb-jar.xml

<?xml version="1.0"?>

<ejb-jar xmlns="http://java.sun.com/xml/ns/j2ee";
         version="2.1"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd";>
 
  <display-name>Product</display-name>

  <enterprise-beans>
    <entity>
      <ejb-name>Product</ejb-name>
      <home>examples.cmp.ProductHome</home>
      <remote>examples.cmp.Product</remote>
      <ejb-class>examples.cmp.ProductBean</ejb-class>
      <persistence-type>Container</persistence-type>
      <prim-key-class>examples.cmp.ProductPK</prim-key-class>
     
      <reentrant>false</reentrant>
     
      <cmp-version>2.x</cmp-version>
      <abstract-schema-name>PRODUCTS</abstract-schema-name>
     
      <cmp-field>
        <field-name>productID</field-name>
      </cmp-field>
      <cmp-field>
        <field-name>name</field-name>
      </cmp-field>
      <cmp-field>
        <field-name>description</field-name>
      </cmp-field>
      <cmp-field>
        <field-name>basePrice</field-name>
      </cmp-field>
     
     
 <!--     <query>
        <query-method>
          <method-name>findByPrimaryKey</method-name>
          <method-params>
            <method-param>examples.cmp.ProductPK</method-param>
          </method-params>
        </query-method>
        <ejb-ql>SELECT DISTINCT OBJECT(p) FROM PRODUCTS p WHERE p.productID = ?1
        </ejb-ql>
      </query> -->
     
      <query>
        <query-method>
          <method-name>findByName</method-name>
          <method-params>
            <method-param>java.lang.String</method-param>
          </method-params>
        </query-method>
        <ejb-ql>SELECT DISTINCT OBJECT(p) FROM PRODUCTS p WHERE p.name = ?1
        </ejb-ql>
      </query>

      <query>
        <query-method>
          <method-name>findByDescription</method-name>
          <method-params>
            <method-param>java.lang.String</method-param>
          </method-params>
        </query-method>
        <ejb-ql>SELECT DISTINCT OBJECT(p) FROM PRODUCTS p WHERE p.description = 
?1
        </ejb-ql>
      </query>

      <query>
        <query-method>
          <method-name>findByBasePrice</method-name>
          <method-params>
            <method-param>double</method-param>
          </method-params>
        </query-method>
        <ejb-ql>SELECT DISTINCT OBJECT(p) FROM PRODUCTS p WHERE p.basePrice = 
?1</ejb-ql>
      </query>

      <query>
        <query-method>
          <method-name>findExpensiveProducts</method-name>
          <method-params>
            <method-param>double</method-param>
          </method-params>
        </query-method>
        <ejb-ql><![CDATA[SELECT DISTINCT OBJECT(p) FROM PRODUCTS p WHERE 
p.basePrice > ?1]]></ejb-ql>
      </query>

      <query>
        <query-method>
          <method-name>findCheapProducts</method-name>
          <method-params>
            <method-param>double</method-param>
          </method-params>
        </query-method>
        <ejb-ql><![CDATA[SELECT DISTINCT OBJECT(p) FROM PRODUCTS p WHERE 
p.basePrice < ?1]]></ejb-ql>
      </query>

      <query>
        <query-method>
          <method-name>findAllProducts</method-name>
          <method-params>
          </method-params>
        </query-method>
        <ejb-ql>SELECT DISTINCT OBJECT(p) FROM PRODUCTS p WHERE p.productID IS 
NOT NULL</ejb-ql>
      </query>

    </entity>
  </enterprise-beans>
 
  <assembly-descriptor>
    <container-transaction>
      <method>
        <ejb-name>Product</ejb-name>
        <method-intf>Remote</method-intf>
        <method-name>*</method-name>
      </method>
      <method>
        <ejb-name>Product</ejb-name>
        <method-intf>Home</method-intf>
        <method-name>*</method-name>
      </method>
      <trans-attribute>Required</trans-attribute>
    </container-transaction>
  </assembly-descriptor>

</ejb-jar>

openejb-jar.xml

<?xml version="1.0" encoding="UTF-8"?>

<openejb-jar
    xmlns="http://www.openejb.org/xml/ns/openejb-jar";
    xmlns:naming="http://geronimo.apache.org/xml/ns/naming";
    xmlns:security="http://geronimo.apache.org/xml/ns/security";
    xmlns:sys="http://geronimo.apache.org/xml/ns/deployment";
    configId="ProductEJB"
    parentId="org/apache/geronimo/SystemDatabase">
<cmp-connection-factory>
     <resource-link>SystemDatasource</resource-link>
     <!-- <name>SystemDatasource</name> -->
</cmp-connection-factory>
<enterprise-beans>
    <entity>
        <ejb-name>Product</ejb-name>
        <jndi-name>ProductRemote</jndi-name>
        <local-jndi-name>ProductLocal</local-jndi-name>      
        <table-name>PRODUCTS</table-name>
    <cmp-field-mapping>
        <cmp-field-name>productID</cmp-field-name>
        <table-column>PRODUCTID</table-column>
    </cmp-field-mapping>
    <cmp-field-mapping>
        <cmp-field-name>name</cmp-field-name>
        <table-column>NAME</table-column>
        </cmp-field-mapping>
    <cmp-field-mapping>
        <cmp-field-name>basePrice</cmp-field-name>
        <table-column>BASEPRICE</table-column>
        </cmp-field-mapping>
    <cmp-field-mapping>
        <cmp-field-name>description</cmp-field-name>
        <table-column>DESCRIPTION</table-column>
        </cmp-field-mapping>       
       
    </entity>
</enterprise-beans>
</openejb-jar>

While i was debugging I saw a method
public IdentityTransform getPrimaryKeyTransform(Entity entity) in the class 
IdentityDefinerBuilder. Here based on size of pkFields the SimplePKTransform or 
CompoundPKTransform class is selected.
In the case of a custom class with 1 field also the SimplePKTransform is 
selected.
Is this how it should behave? Could you give a general idea of how the primary 
key values are taken from the Custom classes in OpenEJB?


Thanks
Manu

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to