Insert when using collection description with indirection table doesn't auto 
populate foreign keys.
---------------------------------------------------------------------------------------------------

         Key: OJB-87
         URL: http://issues.apache.org/jira/browse/OJB-87
     Project: OJB
        Type: Bug
  Components: PB-API  
    Versions: 1.0.4    
 Environment: Linux / MySQL
    Reporter: Al Lofus


We have a defined class descriptor with a contained collection descriptor that 
uses an indirection table as follows:

<class-descriptor class="com.dchoc.common.entity.LeagueEntity" table="LEAGUES">
        <field-descriptor id="1" name="id" column="ID" jdbc-type="INTEGER" 
primarykey="true" autoincrement="true"/>
        <field-descriptor id="2" name="name" column="NAME" jdbc-type="VARCHAR"/>
        <field-descriptor id="3" name="createdDate" column="CREATED_DATE" 
jdbc-type="TIMESTAMP"/>
    <collection-descriptor
     name="members"
     auto-retrieve="true"
     auto-update="object"
     auto-delete="object"
     proxy="true"
     indirection-table="LEAGUE_MEMBERS"
     element-class-ref="com.dchoc.common.entity.LeagueAccountEntity">
                <orderby name="leagueSequence" sort="ASC"/>
                <fk-pointing-to-this-class column="LEAGUE_ID"/>
                <fk-pointing-to-element-class column="LEAGUE_ACCOUNT_ID"/>
    </collection-descriptor>
</class-descriptor>

We have code that creates an instance of this class (LeagueEntity) and 
populates a collection called members (with LeagueAccountEntities) that maps to 
the above collection descriptor and then attempts to create the LeagueEntity 
using pBroker.store(obj, ObjectModification.INSERT). It worked fine with OJB 
1.0.1 through 1.0.3. However, I just upgraded us to 1.0.4 today and the code 
now throws an exception, as follows:

   [junit] [org.apache.ojb.broker.accesslayer.JdbcAccessImpl] ERROR:
    [junit] * SQLException during execution of sql-statement:
    [junit] * sql statement was 'INSERT INTO LEAGUE_ACCOUNT 
(ID,LEAGUE_ID,ACCOUNT_ID,LEAGUE_SEQUENCE) VALUES (?,?,?,?) '
    [junit] * Exception message is [Column 'LEAGUE_ID' cannot be null]
    [junit] * Vendor error code [1048]
    [junit] * SQL state code [23000=INTEGRITY CONSTRAINT VIOLATION]
    [junit] * Target class is 'com.dchoc.common.entity.LeagueAccountEntity'
    [junit] * PK of the target object is [id=242]
    [junit] * Source object: LeagueAccountEntity[accountId: '252', leagueId: 
null, leagueSequence: '5', id: '242', ]
    [junit] * The root stack trace is -->
    [junit] * java.sql.SQLException: Column 'LEAGUE_ID' cannot be null
    [junit]     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2847)
    [junit]     at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1531)
    [junit]     at 
com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1347)
    [junit]     at 
com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:958)
    [junit]     at 
com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1957)
    [junit]     at 
com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1880)
    [junit]     at 
com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1741)
    [junit]     at 
org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:101)
    [junit]     at 
org.apache.ojb.broker.accesslayer.JdbcAccessImpl.executeInsert(Unknown Source)
    [junit]     at 
org.apache.ojb.broker.core.PersistenceBrokerImpl.storeToDb(Unknown Source)
    [junit]     at 
org.apache.ojb.broker.core.PersistenceBrokerImpl.store(Unknown Source)
    [junit]     at 
org.apache.ojb.broker.core.PersistenceBrokerImpl.store(Unknown Source)
    [junit]     at 
org.apache.ojb.broker.core.PersistenceBrokerImpl.store(Unknown Source)
    [junit]     at 
org.apache.ojb.broker.core.PersistenceBrokerImpl.storeAndLinkMtoN(Unknown 
Source)
    [junit]     at 
org.apache.ojb.broker.core.PersistenceBrokerImpl.storeCollections(Unknown 
Source)
    [junit]     at 
org.apache.ojb.broker.core.PersistenceBrokerImpl.storeToDb(Unknown Source)
    [junit]     at 
org.apache.ojb.broker.core.PersistenceBrokerImpl.store(Unknown Source)
    [junit]     at 
org.apache.ojb.broker.core.PersistenceBrokerImpl.store(Unknown Source)
    [junit]     at 
org.apache.ojb.broker.core.PersistenceBrokerImpl.store(Unknown Source)
    [junit]     at 
org.apache.ojb.broker.core.DelegatingPersistenceBroker.store(Unknown Source)
    [junit]     at 
org.apache.ojb.broker.core.DelegatingPersistenceBroker.store(Unknown Source)

Now, in stepping into the code, it looks like the LEAGUES entry is *not* being 
created/inserted into the database before the attempt is made to do the inserts 
for the members in the contained collection. Thus, there is no league ID 
foreign key available when the inserts for the members (LEAGUE_MEMBERS) are 
done. I'm not sure if that is really what's happening, but that's what it looks 
like. Note that if I change the collection descriptor to *not* use the 
indirection-table attribute and to just use a more typical foreignkey element 
in place of the fk-pointing-to-this-class and fk-pointing-to-element-class 
elements, then the code works and stops throwing the exception. So the 
indirection-table attribute seems to be at the heart of the problem.

Note that as a workaround, we are creating the entity with the collection 
descriptor set to null, then adding the desired members and updating the 
entity. This solution seems to be working, but has the undesired effect of 
requiring two database hits for each league we want to create.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to