Problem using CMR in 1-1 relationship
badibouzouk Jan 2, 2003 11:33 PMHello,
I'm trying to setup a 1-1 relationship using CMR. It seems that JBoss correctly creates the tables including the foreign keys, but when I try to call the setter for the CMR field (e.g setCompte()), JBoss throws an exception :
05:26:21,103 ERROR [LogInterceptor]TransactionRolledbackException, causedBy:
java.lang.ClassCastExceptionb: $Proxy170
at org.jboss.ejb.plugins.cmp.jdbc.bridge.JBDCCMRFieldBridge.setInstanceValue(JDBCCMRFieldBridge.java:551)
at org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMRFieldBridge.setValue(JDBCCMRFieldBridge.java:483)
at org.jboss.ejb.plugins.cmp.bridge.ENtityBridgeInvocationHandler.invoke(EntityBridgeInvocationHandler.java:126)
at org.jboss.proxy.compiler.Runtine.invoke(Runtine.java:59)
at com.Banque.entities.ClientCMP$Proxy.setCompte()
...
I've attached the ejb-jar & jbosscmp-jdbc.xml files; I'm using JBoss 3.0.4 & MySQL. Any suggestions would be greatly appreciated =o)
ejb-jar.cmp:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar >
No Description.
<display-name>Generated by XDoclet</display-name>
<enterprise-beans>
<!-- Session Beans -->
<![CDATA[No Description.]]>
<ejb-name>Banque</ejb-name>
com.Banque.session.BanqueHome
com.Banque.session.Banque
<ejb-class>com.Banque.session.BanqueSession</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
<ejb-ref>
<ejb-ref-name>ejb/Client</ejb-ref-name>
<ejb-ref-type>Entity</ejb-ref-type>
ClientHome
com.Banque.entities.Client
<ejb-link>Client</ejb-link>
</ejb-ref>
<ejb-ref>
<ejb-ref-name>ejb/Compte</ejb-ref-name>
<ejb-ref-type>Entity</ejb-ref-type>
CompteHome
com.Banque.entities.Compte
<ejb-link>Compte</ejb-link>
</ejb-ref>
<!--
To add session beans that you have deployment descriptor info for, add
a file to your merge directory called session-beans.xml that contains
the markup for those beans.
-->
<!-- Entity Beans -->
<![CDATA[No Description.]]>
<ejb-name>Compte</ejb-name>
com.Banque.entities.CompteHome
com.Banque.entities.Compte
<ejb-class>com.Banque.entities.CompteCMP</ejb-class>
<persistence-type>Container</persistence-type>
<prim-key-class>com.Banque.entities.ComptePK</prim-key-class>
False
<cmp-version>2.x</cmp-version>
<abstract-schema-name>Compte</abstract-schema-name>
<cmp-field><field-name>uid</field-name></cmp-field>
<cmp-field><field-name>solde</field-name></cmp-field>
<![CDATA[No Description.]]>
<ejb-name>Client</ejb-name>
com.Banque.entities.ClientHome
com.Banque.entities.Client
<ejb-class>com.Banque.entities.ClientCMP</ejb-class>
<persistence-type>Container</persistence-type>
<prim-key-class>com.Banque.entities.ClientPK</prim-key-class>
False
<cmp-version>2.x</cmp-version>
<abstract-schema-name>Client</abstract-schema-name>
<cmp-field><field-name>password</field-name></cmp-field>
<cmp-field><field-name>email</field-name></cmp-field>
<cmp-field><field-name>nom</field-name></cmp-field>
<cmp-field><field-name>prenom</field-name></cmp-field>
<!--
To add entity beans that you have deployment descriptor info for, add
a file to your merge directory called entity-beans.xml that contains
the markup for those beans.
-->
<!-- Message Driven Beans -->
<!--
To add message driven beans that you have deployment descriptor info for, add
a file to your merge directory called message-driven-beans.xml that contains
the <message-driven></message-driven> markup for those beans.
-->
</enterprise-beans>
<!-- Relationships -->
<ejb-relation>
<ejb-relation-name>Client-Compte</ejb-relation-name>
<foreign-key-mapping/>
<ejb-relationship-role>
<ejb-relationship-role-name>Client-has-Compte</ejb-relationship-role-name>
One
<relationship-role-source>
<ejb-name>Client</ejb-name>
</relationship-role-source>
<cmr-field>
<cmr-field-name>compte</cmr-field-name>
</cmr-field>
</ejb-relationship-role>
<ejb-relationship-role>
<ejb-relationship-role-name>Compte-has-Client</ejb-relationship-role-name>
One
<relationship-role-source>
<ejb-name>Compte</ejb-name>
</relationship-role-source>
<cmr-field>
<cmr-field-name>client</cmr-field-name>
</cmr-field>
</ejb-relationship-role>
</ejb-relation>
<!-- Assembly Descriptor -->
<assembly-descriptor >
<!-- finder permissions -->
<method-permission>
<ejb-name>Compte</ejb-name>
<method-name>*</method-name>
</method-permission>
<method-permission>
<ejb-name>Client</ejb-name>
<method-name>*</method-name>
</method-permission>
<method-permission>
<ejb-name>Banque</ejb-name>
<method-name>*</method-name>
</method-permission>
<!-- transactions -->
<container-transaction>
<ejb-name>Client</ejb-name>
<method-name>*</method-name>
<trans-attribute>Required</trans-attribute>
</container-transaction>
<container-transaction>
<ejb-name>Compte</ejb-name>
<method-name>*</method-name>
<trans-attribute>Required</trans-attribute>
</container-transaction>
<container-transaction>
<ejb-name>Banque</ejb-name>
<method-name>*</method-name>
<trans-attribute>Required</trans-attribute>
</container-transaction>
<!-- finder transactions -->
</assembly-descriptor>
</ejb-jar>
jbosscmp-jdbc.cmp:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jbosscmp-jdbc PUBLIC "-//JBoss//DTD JBOSSCMP-JDBC 3.0//EN" "http://www.jboss.org/j2ee/dtd/jbosscmp-jdbc_3_0.dtd">
<jbosscmp-jdbc>
java:/MySqlDS
<datasource-mapping>mySQL</datasource-mapping>
<enterprise-beans>
<ejb-name>Compte</ejb-name>
<table-name>comptes</table-name>
<!--
To define load groups for this entity, write a file named
jbosscmp-jdbc-load-CompteBean.xml and put it in
your mergedir. Write it according to the following DTD slice:
<!ELEMENT load-groups (load-group+)>
<!ELEMENT load-group (load-group-name, description?, field-name+)>
<!ELEMENT load-group-name (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ELEMENT field-name (#PCDATA)>
<!ELEMENT eager-load-group (#PCDATA)>
<!ELEMENT lazy-load-groups (load-group-name+)>
-->
<ejb-name>Client</ejb-name>
<table-name>clients</table-name>
<!--
To define load groups for this entity, write a file named
jbosscmp-jdbc-load-ClientBean.xml and put it in
your mergedir. Write it according to the following DTD slice:
<!ELEMENT load-groups (load-group+)>
<!ELEMENT load-group (load-group-name, description?, field-name+)>
<!ELEMENT load-group-name (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ELEMENT field-name (#PCDATA)>
<!ELEMENT eager-load-group (#PCDATA)>
<!ELEMENT lazy-load-groups (load-group-name+)>
-->
</enterprise-beans>
<ejb-relation>
<ejb-relation-name>Client-Compte</ejb-relation-name>
<foreign-key-mapping/>
<ejb-relationship-role>
<ejb-relationship-role-name>Client-has-Compte</ejb-relationship-role-name>
<key-fields>
<key-field>
<field-name>nom</field-name>
<column-name>client_nom</column-name>
</key-field>
<key-field>
<field-name>prenom</field-name>
<column-name>client_prenom</column-name>
</key-field>
</key-fields>
</ejb-relationship-role>
<ejb-relationship-role>
<ejb-relationship-role-name>Compte-has-Client</ejb-relationship-role-name>
<key-fields>
<key-field>
<field-name>uid</field-name>
<column-name>compte_uid</column-name>
</key-field>
</key-fields>
</ejb-relationship-role>
</ejb-relation>
<dependent-value-classes>
</dependent-value-classes>
</jbosscmp-jdbc>
---
Badi