1 Reply Latest reply on Mar 7, 2007 11:10 AM by roist

    EJB 2.0: Compound Primary Key and CMR

    fermat42

      Hello,

      ist it possible with EJB 2.0 and 2 EJBs (CMP) with Compound Primary Keays to
      use a CMR? I tried it with Netbeans 5.5 and JBoss 4.0.4. There I got
      following error:

      14:52:27,539 INFO [BaseLocalProxyFactory] Bound EJB
       LocalHome 'StoragePoolBean' to jndi 'local/StoragePoolBean@26869040'
      14:52:27,544 INFO [ProxyFactory] Bound EJB Home 'StoragePoolBean' to
       jndi 'StoragePoolBean'
      14:52:27,551 INFO [BaseLocalProxyFactory] Bound EJB
       LocalHome 'VirtualVolumeBean' to jndi 'local/VirtualVolumeBean@31649249'
      14:52:27,556 INFO [ProxyFactory] Bound EJB Home 'VirtualVolumeBean' to
       jndi 'VirtualVolumeBean'
      org.jboss.deployment.DeploymentException: Both roles of a relation-table
       mapped relationship must have key fields:
       ejb-relation-name=SP-contains-VVs
      




      The Beans seem to be o.k., the CMR not. My config:

      <?xml version="1.0" encoding="UTF-8"?>
      <ejb-jar version="2.1" xmlns="http://java.sun.com/xml/ns/j2ee"
      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>mda2-EJBModule</display-name>
       <enterprise-beans>
       <entity>
       <display-name>StoragePoolEB</display-name>
       <ejb-name>StoragePoolBean</ejb-name>
       <home>de.virticalsolutions.vdrive.mda.StoragePoolRemoteHome
       </home>
       <remote>de.virticalsolutions.vdrive.mda.StoragePoolRemote
       </remote>
       <local-home>de.virticalsolutions.vdrive.mda.StoragePoolLocalHome
       </local-home>
       <local>de.virticalsolutions.vdrive.mda.StoragePoolLocal
       </local>
       <ejb-class>de.virticalsolutions.vdrive.mda.StoragePoolBean
       </ejb-class>
       <persistence-type>Container
       </persistence-type>
       <prim-key-class>de.virticalsolutions.vdrive.mda.StoragePoolPK
       </prim-key-class>
       <reentrant>false</reentrant>
       <abstract-schema-name>StoragePool</abstract-schema-name>
      [...]
       </entity>
       <entity>
       <display-name>VirtualVolumeEB</display-name>
       <ejb-name>VirtualVolumeBean</ejb-name>
       <home>de.virticalsolutions.vdrive.mda.VirtualVolumeRemoteHome
       </home>
       <remote>de.virticalsolutions.vdrive.mda.VirtualVolumeRemote
       </remote>
       <local-home>
       de.virticalsolutions.vdrive.mda.VirtualVolumeLocalHome
       </local-home>
       <local>de.virticalsolutions.vdrive.mda.VirtualVolumeLocal
       </local>
       <ejb-class>de.virticalsolutions.vdrive.mda.VirtualVolumeBean
       </ejb-class>
       <persistence-type>Container</persistence-type>
       <prim-key-class>de.virticalsolutions.vdrive.mda.VirtualVolumePK
       </prim-key-class>
       <reentrant>false</reentrant>
       <abstract-schema-name>VirtualVolume</abstract-schema-name>
      [...]
       </entity>
       </enterprise-beans>
       <relationships>
       <ejb-relation>
       <description/>
       <ejb-relation-name>SP-contains-VVs</ejb-relation-name>
       <ejb-relationship-role>
       <ejb-relationship-role-name>SPhasVV
       </ejb-relationship-role-name>
       <multiplicity>One</multiplicity>
       <relationship-role-source>
       <ejb-name>StoragePoolBean</ejb-name>
       </relationship-role-source>
       <cmr-field>
       <cmr-field-name>virtualVolumes</cmr-field-name>
       <cmr-field-type>java.util.Collection</cmr-field-type>
       </cmr-field>
       </ejb-relationship-role>
       <ejb-relationship-role>
       <ejb-relationship-role-name>VVinSP
       </ejb-relationship-role-name>
       <multiplicity>Many</multiplicity>
       <relationship-role-source>
       <ejb-name>VirtualVolumeBean</ejb-name>
       </relationship-role-source>
       <cmr-field>
       <cmr-field-name>storagePool</cmr-field-name>
       </cmr-field>
       </ejb-relationship-role>
       </ejb-relation>
       </relationships>
       <assembly-descriptor>
      [...]
       </assembly-descriptor>
      </ejb-jar>
      


      ===========================================================================
      The Primary Keys have no fields of the same name. I also tried to write the
      mapping in the jbosscmp-jdbc. As you will see I used e relation-table, no
      forign key. But with a forign-key I got the same result. Here is my
      jbosscmp-jdbc.xml:

      <jbosscmp-jdbc>
       <relationships>
       <ejb-relation>
       <ejb-relation-name>SP-contains-VVs</ejb-relation-name>
       <relation-table-mapping>
       <table-name>storagepool_has_virtualvolumes</table-name>
       </relation-table-mapping>
       <ejb-relationship-role>
       <ejb-relationship-role-name>SPhasVV
       </ejb-relationship-role-name>
       <key-fields>
       <key-field>
       <field-name>spID</field-name>
       <column-name>storagepool</column-name>
       </key-field>
       <key-field>
       <field-name>spSessionID</field-name>
       <column-name>storagepool_session</column-name>
       </key-field>
       </key-fields>
       </ejb-relationship-role>
       <ejb-relationship-role>
       <ejb-relationship-role-name>VVinSP
       </ejb-relationship-role-name>
       <key-fields>
       <key-field>
       <field-name>vvID</field-name>
       <column-name>virtualvolume</column-name>
       </key-field>
       <key-field>
       <field-name>vvSessionID</field-name>
       <column-name>virtualvolume_session</column-name>
       </key-field>
       </key-fields>
       </ejb-relationship-role>
       </ejb-relation>
       </relationships>
      </jbosscmp-jdbc>
      


      ===========================================================================

      It would be great if someone could explain me what is going wrong here. At
      the moment I am thinking about not using CMR and make all the relationships
      on my own. But I don't think that it's a good solution because it would be
      much more code for me...

      bests

      Sascha Effert

        • 1. Re: EJB 2.0: Compound Primary Key and CMR
          roist

          if you want compound foreign keys, you've got to work them for yourselves.

          since compound foreign keys are against normalization, i think we won't see this too soon entering any ejb-spec.

          the error is actually quite precise in that 'Both roles of a relation-table
          mapped relationship must have key fields' =
          <prim-key-field> instead of only <prim-key-class>

          i'd always use ids for any table, but this is just my opinion.