EJB 2.0: Compound Primary Key and CMR
fermat42 Mar 1, 2007 10:30 AMHello,
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