[
https://issues.apache.org/jira/browse/OJB-92?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Armin Waibel resolved OJB-92.
-----------------------------
Resolution: Fixed
Fix Version/s: 1.0.5
Hi,
I agree with you, if at least one FK value (of a compounded FK) is null the
reference-query shouldn't be performed - fixed it in
QueryReferenceBroker#hasNullifiedFK(...) method.
Additionally in OJB 1.0.5 the "null check of values" is now pluggable (see
OJB-105).
regards,
Armin
> Unneeded query with Composite FK which has null column(s), which also lead to
> not respecting constraint with some db2 drivers.
> ------------------------------------------------------------------------------------------------------------------------------
>
> Key: OJB-92
> URL: https://issues.apache.org/jira/browse/OJB-92
> Project: OJB
> Issue Type: Bug
> Components: PB-API, RDBMS platform-specific support
> Affects Versions: 1.0.3, 1.0.4, 1.0.x CVS
> Reporter: Quinet Jérémie
> Priority: Minor
> Fix For: 1.0.5
>
>
> Hello,
> i have a problem using composite FK, which may contain null column(s),
> here is a simple description :
> table1
> brand varchar(10) not null
> code varchar(1) not null
> the PK is composite : brand,code
> table2
> brand varchar(10) not null
> country varchar(2) not null
> code varchar(1)
> the PK is composite : brand,country
> and there is a FK (brand,code) pointing to table1
> On db2 (and i think it's not the only rdbms) when you have a composite FK,
> the FK is considered 'null' (and integrity is ok) when at least one of the
> column is null, and so per example we can find in table2 a row with values :
> brand='brand1' country='fr' and a null code.
> We have this kind of mapping :
> <class-descriptor
> class="test.bean.Object1"
> table="TABLE1"
> >
> <field-descriptor
> name="brand"
> column="BRAND"
> jdbc-type="VARCHAR"
> length="10"
> primarykey="true"
> />
> <field-descriptor
> name="code"
> column="CODE"
> jdbc-type="CHAR"
> length="1"
> primarykey="true"
> />
> </class-descriptor>
> <class-descriptor
> class="test.bean.Object2"
> table="TABLE2"
> >
> <field-descriptor
> name="brand"
> column="BRAND"
> jdbc-type="VARCHAR"
> length="10"
> primarykey="true"
> />
> <field-descriptor
> name="country"
> column="COUNTRY"
> jdbc-type="VARCHAR"
> length="2"
> primarykey="true"
> />
> <field-descriptor
> name="code"
> column="CODE"
> jdbc-type="CHAR"
> length="1"
> />
> <reference-descriptor name="referenceToObject1"
> class-ref="test.bean.Object1">
> <foreignkey field-ref="brand"/>
> <foreignkey field-ref="code"/>
> </reference-descriptor>
> </class-descriptor>
> When retrieving an instance of object2 using a QueryByIdentity (or
> QueryByCriteria) with brand='brand1' and country='fr' the generated SQL is
> like that :
> SELECT BRAND,COUNTRY,CODE FROM TABLE2 WHERE BRAND = ? AND COUNTRY = ?
> which point to the row : brand='brand1' country='fr' and a null code
> then OJB try to retrieve the referenceToObject1 and generate this query :
> SELECT BRAND,CODE FROM TABLE1 WHERE BRAND = ? AND CODE = ?
> which is not needed as the FK for the row retrieved in table2 (brand,code) is
> 'null', on the PreparedStatement related to this query it tries a setNull on
> the second parameter but the problem for me is that the Universal DB2 Driver
> we use on Z/OS check constraints when executing setNull and throw an
> exception explaining the parameter can't be null.
> i have quickly look at the source code use to retrieve the references, and
> see on the QueryReferenceBroker class that the getReferencedObjectIdentity
> method was used to get the Identity of the reference object and this method
> use the hasNullifiedFK method to check if the FK is null, couldn't it be
> possible to move the hasNullifiedFK to the Platform class or a mechanism to
> extend it ? (at this time i have made an extension of PersistenceBrokerImpl a
> use a new QueryReferenceBroker class).
> i don't think the default behavior which is to tag a composite FK as null
> only if all the columns are null is correct for all the rdbms (at least for
> db2).
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]