Hi, really frustating... been trying to get my CMR setup for last three days but
without much success (shame).
My setup is simple. I have three beans:
1. UserBean
2. GroupBean
3. GroupMembershipBean
Each User (UserBean) can belong to multiple Group(s) (GroupBean).
1. UserBean maps to table USERS, table schema:
Primary key: UIN
Other fields: login, email, ... etc
2. GroupBean maps to table GROUPS, table schema:
Primary key: UIN
Other fields: name, decription, ... etc
3. GroupMembershipBean maps to table GROUPMEMBERSHIP, table schema:
Composite Primary Key: {GROUPUIN, USERUIN}
Foreign key on USERUIN and GROUPUIN that points to table USERS and table GROUPS
There's a One-To-Many relationship between GroupBean (One-side) and GroupMembership
(Many-side).
1. GroupBean:
| /**
| * @ejb.bean
| * name="GroupEJB"
| * local-jndi-name="ejb/UserGroup"
| * display-name="User Group EJB"
| * description="User Group EJB"
| * cmp-version="2.x"
| * type="CMP"
| * view-type="local"
| * schema="Group"
| * reentrant="false"
| * primkey-field="UIN"
| *
| * @ejb.persistence
| * table-name="GROUPS"
| *
| * @ejb.finder
| * query="SELECT OBJECT(g) FROM Group AS g"
| * signature="java.util.Collection findAllGroups()"
| *
| * @ejb.interface
| * local-extends="javax.ejb.EJBLocalObject,
java.lang.Comparable, java.io.Serializable"
| * local-class="com.aa.samples.interfaces.GroupLocal"
| *
| * @ejb.home
| * local-class="com.aa.samples.interfaces.GroupLocalHome"
| *
| * @jboss.persistence
| * datasource="java:/jdbc/dev01"
| * datasource-mapping="mySQL"
| * create-table="false"
| * remove-table="false"
| */
| public abstract class GroupBean implements EntityBean, Serializable, Comparable {
| ... other stuff ...
| /**
| * @ejb.relation
| * name="GroupEJB-GroupMembershipEJB"
| * role-name="GroupEJB-has-GroupMembershipEJB"
| *
| * @ejb.interface-method
| */
| public abstract Collection getGroupMembershipBean();
| public abstract void setGroupMembershipBean(Collection memberships);
| ... other stuff ...
| }
|
2. GroupMembershipBean:
| /**
| *
| * @ejb.bean
| * name="GroupMembershipEJB"
| * local-jndi-name="ejb/GroupMembership"
| * display-name="Group Membership EJB"
| * description="Group Membership Group EJB"
| * cmp-version="2.x"
| * type="CMP"
| * view-type="local"
| * schema="GroupMembership"
| * reentrant="false"
| *
| * @ejb.persistence
| * table-name="GROUPMEMBERSHIP"
| *
| * @ejb.pk
| * class="com.aa.samples.primarykeys.GroupMembershipKey"
| *
| * @ejb.interface
| * local-extends="javax.ejb.EJBLocalObject,
java.lang.Comparable, java.io.Serializable"
| * local-class="com.aa.samples.interfaces.GroupMembershipLocal"
| *
| * @ejb.home
| *
local-class="com.aa.samples.interfaces.GroupMembershipLocalHome"
| *
| * @jboss.persistence
| * datasource="java:/jdbc/dev01"
| * datasource-mapping="mySQL"
| * create-table="false"
| * remove-table="false"
| */
| public abstract class GroupMembershipBean implements EntityBean, Serializable,
Comparable {
| ... other stuff ...
| /**
| * @ejb.persistent-field
| * @ejb.persistence
| * column-name="GROUPUIN"
| * sql-type="INTEGER"
| * @ejb.pk-field
| * @ejb.interface-method
| *
| */
| public abstract Integer getGroupUIN();
|
| /**
| * @ejb.interface-method
| */
| public abstract void setGroupUIN(Integer groupUIN);
|
| /**
| * @ejb.persistent-field
| * @ejb.persistence
| * column-name="USERUIN"
| * sql-type="INTEGER"
| * @ejb.pk-field
| * @ejb.interface-method
| */
| public abstract Integer getUserUIN();
|
| /**
| * @ejb.interface-method
| */
| public abstract void setUserUIN(Integer userUIN);
|
| /**
| * @ejb.relation
| * name="GroupEJB-GroupMembershipEJB"
| * role-name="GroupMembershipEJB-has-GroupEJB"
| * target-multiple="yes"
| * cascade-delete="yes"
| *
| * @jboss.relation
| * related-pk-field="UIN"
| * fk-column="GROUPUIN"
| *
| * @ejb.interface-method
| */
| public abstract GroupLocal getGroup();
|
| public abstract void setGroup(GroupLocal group);
| ... other stuff ...
| }
|
I ran XDoclet, BOTH "ejb-jar.xml" and "jbosscmp-jdbc.xml" looks right:
1. ""ejb-jar.xml"
... other stuff ...
<ejb-relation >
<ejb-relation-name>GroupEJB-GroupMembershipEJB</ejb-relation-name>
<ejb-relationship-role >
<ejb-relationship-role-name>GroupMembershipEJB-has-GroupEJB</ejb-relationship-role-name>
Many
<cascade-delete/>
<relationship-role-source >
<ejb-name>GroupMembershipEJB</ejb-name>
</relationship-role-source>
<cmr-field >
<cmr-field-name>group</cmr-field-name>
</cmr-field>
</ejb-relationship-role>
<ejb-relationship-role >
<ejb-relationship-role-name>GroupEJB-has-GroupMembershipEJB</ejb-relationship-role-name>
One
<relationship-role-source >
<ejb-name>GroupEJB</ejb-name>
</relationship-role-source>
<cmr-field >
<cmr-field-name>groupMembershipBean</cmr-field-name>
<cmr-field-type>java.util.Collection</cmr-field-type>
</cmr-field>
</ejb-relationship-role>
</ejb-relation>
... other stuff ...
2. "jbosscmp-jdbc.xml"
... other stuff ...
<ejb-relation>
<ejb-relation-name>GroupEJB-GroupMembershipEJB</ejb-relation-name>
<ejb-relationship-role>
<ejb-relationship-role-name>GroupMembershipEJB-has-GroupEJB</ejb-relationship-role-name>
<key-fields/>
</ejb-relationship-role>
<ejb-relationship-role>
<ejb-relationship-role-name>GroupEJB-has-GroupMembershipEJB</ejb-relationship-role-name>
<key-fields>
<key-field>
<field-name>UIN</field-name>
<column-name>GROUPUIN</column-name>
</key-field>
</key-fields>
</ejb-relationship-role>
</ejb-relation>
... other stuff ...
The problem is,
| ...
| GroupLocal group=groupHome.findByPrimaryKey(groupUIN);
| Collection membershiplist=group.getGroupMembershipBean(); //EXCEPTION THROWN
| ...
|
And the exception msg is:
| javax.ejb.TransactionRolledbackLocalException: Load relation failed;
CausedByException is:
| Syntax error or access violation message from server: "You have an error in
your SQL syntax. Check the manual that corresponds to your MySQL server version for
the right syntax to use near 'FROM GROUPMEMBERSHIP WHERE (GROUPUIN=1)' at line 1";
CausedByException is:
| Load relation failed; CausedByException is:
| Syntax error or access violation message from server: "You have an error in
your SQL syntax. Check the manual that corresponds to your MySQL server version for
the right syntax to use near 'FROM GROUPMEMBERSHIP WHERE (GROUPUIN=1)' at line 1"
|
I used p6spy (http://www.p6spy.com/) to intercept any SQL to database, and I found:
| 1099567741656|-1||resultset|SELECT name, description, isSuspended FROM GROUPS
WHERE (UIN='1')|description = Administrators Group, name = Administrators
|
| 1099567755138|161|0|statement|SELECT FROM GROUPMEMBERSHIP WHERE
(GROUPUIN=?)|SELECT FROM GROUPMEMBERSHIP WHERE (GROUPUIN='1')
|
Notice on second line:
SELECT FROM (GROUPUIN='1')
instead of:
SELECT * FROM (GROUPUIN=1)
There're two things weird about this:
a. SELECT * --- The "*" is missing - this is not present in error message when I
stepped thru the code.
b. GROUPUIN='1' --- why's there's single quote around '1'?
Help! I've been staring at this for sometime now and it's getting desparate. HELP!
View the original post :
http://www.jboss.org/index.html?module=bb&op=viewtopic&p=3853850#3853850
Reply to the post :
http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=3853850
-------------------------------------------------------
This SF.Net email is sponsored by:
Sybase ASE Linux Express Edition - download now for FREE
LinuxWorld Reader's Choice Award Winner for best database on Linux.
http://ads.osdn.com/?ad_id=5588&alloc_id=12065&op=click
_______________________________________________
JBoss-user mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-user