CMR 1:1 Unidirectional relationship : JBOSS tries to insert
ajacob Apr 18, 2002 3:31 PMHello, I'm trying to get a simple unidirectional relationship working. In the code below, TDNSBean references the appl_ref_id field of ApplicationBean. I was originally trying to reference the primary key appl_id field of ApplicationBean, but read somewhere in here that CMR doesn't work when the Foreign Key being referred to is the Primary Key of the referred table.
When I try to create an ApplicationBean, I get the following error:
12:12:00,946 ERROR [ApplicationBean] Could not create entity
java.sql.SQLException: [Solid JDBC 02.10.0043] SOLID SQL Error 13: illegal column name 'TDNSBEAN_APP
L_REF_ID'
This column doesnt exist and shouldn't exist, because the 1:1 unidirectional relationship I am trying to implement has TDNSBean referring to ApplicationBean (ApplicationBean doesn't know about TDNSBean), and also because I've explicitly overridden table mappings in jbosscmp-jdbc.xml.
Any help/pointers would be greatly appreciated. My basic questions as a result of this problem:
(1) is it true I can't reference primary key fields in a CMR relationship?
(2) in a 1:1 unidirectional relationship, I thought that the referenced field of the referenced table would be defined with a <cmp-field> tag (standard cmp definition), and that the referenced field of the referring table would be defined with a <cmr-field> tag.
I've included the table structures, ejb-jar.xml listing, and jbosscmp-jdbc.xml listing.
Here is the SQL definition for the Application table:
TABLE application (
appl_id INTEGER NOT NULL,
server_id INTEGER, -- WARNING: relax it for now
appl_name_id INTEGER NOT NULL,
version VARCHAR(64),
userid VARCHAR(64),
password VARCHAR(128),
hostname VARCHAR(32),
appl_ref_id INTEGER UNIQUE,
PRIMARY KEY (appl_id),
FOREIGN KEY (hostname, server_id) REFERENCES location(hostname, server_id),
FOREIGN KEY (server_id) REFERENCES server(server_id),
FOREIGN KEY (appl_name_id) REFERENCES ApplType(appl_name_id)
);
and the SQL definition for the TDNS table:
TABLE tdns (
tdns_id INTEGER NOT NULL,
appl_ref_id INTEGER NOT NULL,
PRIMARY KEY (tdns_id),
FOREIGN KEY (appl_ref_id) REFERENCES application(appl_ref_id)
);
The relevant sections of my ejb-jar.xml:
<?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>
<enterprise beans>
<display-name>Application Bean</display-name>
<ejb-name>ApplicationBean</ejb-name>
demo.ApplicationLocal
<local-home>demo.ApplicationLocalHome</local-home>
demo.ApplicationHome
demo.Application
<ejb-class>demo.ApplicationBean</ejb-class>
<persistence-type>Container</persistence-type>
<prim-key-class>java.lang.Integer</prim-key-class>
false
<cmp-version>2.x</cmp-version>
<abstract-schema-name>Application</abstract-schema-name >
<cmp-field><field-name>appl_id</field-name></cmp-field>
<cmp-field><field-name>Server_id</field-name></cmp-field>
<cmp-field><field-name>Appl_name_id</field-name></cmp-field>
<cmp-field><field-name>Userid</field-name></cmp-field>
<cmp-field><field-name>Version</field-name></cmp-field>
<cmp-field><field-name>Password</field-name></cmp-field>
<cmp-field><field-name>Hostname</field-name></cmp-field>
<cmp-field><field-name>appl_ref_id</field-name></cmp-field>
<primkey-field>appl_id</primkey-field>
Override the find all
<query-method>
<method-name>findAll</method-name>
<method-params/>
</query-method>
<ejb-ql>
SELECT DISTINCT OBJECT(a)
FROM Application a
</ejb-ql>
<display-name>TDNS Bean</display-name>
<ejb-name>TDNSBean</ejb-name>
demo.TDNSLocal
<local-home>demo.TDNSLocalHome</local-home>
demo.TDNSHome
demo.TDNS
<ejb-class>demo.TDNSBean</ejb-class>
<persistence-type>Container</persistence-type>
<prim-key-class>java.lang.Integer</prim-key-class>
false
<cmp-version>2.x</cmp-version>
<abstract-schema-name>TDNS</abstract-schema-name>
<cmp-field><field-name>TDNS_id</field-name></cmp-field>
<primkey-field>TDNS_id</primkey-field>
</enterprise beans>
<ejb-relation>
<ejb-relation-name>Application-TDNS</ejb-relation-name>
<ejb-relationship-role>
<ejb-relationship-role-name>TDNS-is-an-Application</ejb-relationship-role-name>
One
<relationship-role-source>
<ejb-name>TDNSBean</ejb-name>
</relationship-role-source>
<cmr-field>
<cmr-field-name>appl_ref_id</cmr-field-name>
</cmr-field>
</ejb-relationship-role>
<ejb-relationship-role>
<ejb-relationship-role-name>Application-can-be-TDNS</ejb-relationship-role-name>
One
<relationship-role-source>
<ejb-name>ApplicationBean</ejb-name>
</relationship-role-source>
</ejb-relationship-role>
</ejb-relation>
</ejb-jar>
and the relevant sections of my jbosscmp-jdbc.xml file:
<?xml version="1.0" encoding="UTF-8"?>
<jbosscmp-jdbc>
java:/SolidDS
<create-table>true</create-table>
<remove-table>false</remove-table>
<pk-constraint>false</pk-constraint>
<relation-mapping-style>foreign-key</relation-mapping-style>
true
<enterprise-beans>
<ejb-name>ApplicationBean</ejb-name>
<table-name>Application</table-name>
<cmp-field><field-name>appl_id</field-name><column-name>APPL_ID</column-name></cmp-field>
<cmp-field><field-name>Server_id</field-name><column-name>Server_id</column-name></cmp-field>
<cmp-field><field-name>Appl_name_id</field-name><column-name>Appl_name_id</column-name></cmp-field>
<cmp-field><field-name>Userid</field-name><column-name>Userid</column-name></cmp-field>
<cmp-field><field-name>Version</field-name><column-name>Version</column-name></cmp-field>
<cmp-field><field-name>Password</field-name><column-name>Password</column-name></cmp-field>
<cmp-field><field-name>Hostname</field-name><column-name>Hostname</column-name></cmp-field>
<cmp-field><field-name>appl_ref_id</field-name><column-name>APPL_REF_ID</column-name></cmp-field>
**Placeholder for jbosscmp-jdbc.xml declaration**
<query-method>
<method-name>findAll</method-name>
<method-params/>
</query-method>
<declared-sql>
as o, (server INNER JOIN device ON server.server_id = device.server_id) LEFT JOIN application ON server.server_id = application.server_id
</declared-sql>
<ejb-name>TDNSBean</ejb-name>
<table-name>TDNS</table-name>
<cmp-field>
<field-name>TDNS_id</field-name>
<column-name>TDNS_ID</column-name>
</cmp-field>
</enterprise beans>
<relation-mapping-style>foreign-key</relation-mapping-style>
<ejb-relation>
<ejb-relation-name>Application-TDNS</ejb-relation-name>
<foreign-key-mapping>
<ejb-relationship-role>
<ejb-relationship-role-name>TDNS-is-an-Application</ejb-relationship-role-name>
<foreign-key-fields>
<foreign-key-field>
<field-name>appl_ref_id</field-name>
<column-name>APPL_REF_ID</column-name>
</foreign-key-field>
</foreign-key-fields>
</ejb-relationship-role>
<ejb-relationship-role>
<ejb-relationship-role-name>Application-can-be-TDNS</ejb-relationship-role-name>
<foreign-key-fields/>
</ejb-relationship-role>
</foreign-key-mapping>
</ejb-relation>
</jbosscmp-jdbc>