Hi,

I can now reproduce your issue.
It's "caused" by a feature "query prefetching" added to OJB between version 0.98 and 1.0rcX. I'm not familiar with the source code of this feature. Currently the prefetching of references can only be suppressed by changing class QueryReferenceBroker, set line 75
batchRetrieval = false;
After this your test should pass.
I will add a bug report to jira ASAP.

regards,
Armin


Armin Waibel wrote:
Hi Ravi,

I will try to setup a test based on your last post to reproduce your issue.
Stay tuned!

regards,
Armin

Ravi wrote:

Armin Waibel <arminw <at> apache.org> writes:


Hi Ravi,

I can't find significant changes between 0.98 and 1.0.x. The main change
is, that the target object of the AfterLookupEvent Object was
immediately nullified after fire the event (because for better
performance OJB reuse the AfterLookupEvent Object and therefore the target object of the event will be nullified after the "fireEvent" method return).

class RsIterator:
// materialize object
...
// lookup reused event object and set current object as target
getAfterLookupEvent().setTarget(obj);
// fire event
getBroker().fireBrokerEvent(getAfterLookupEvent());
// nullify the target object to prepare event instance for reuse
getAfterLookupEvent().setTarget(null);
...

Thus, if you queue the AfterLookupEvent objects you will run into problems, e.g. NPE when try to use the target object. In this case you should store the target object in a separate "queue object" when the event is fired.




Hi Armin

Thanks for your response.

I am having problem only with batch load. To make it simple, I created two classes TestA and TestB with TestA having reference to TestB and printing TestB's name in afterLookUp(). If I load TestA objects individually by Id using a criteria like below, it works fine and prints TestB's name correctly.

Criteria criteria = new Criteria();
criteria.addEqualTo( "id", id );
QueryByCriteria qByCriteria = new QueryByCriteria( TestA.class, criteria );
return broker.getObjectByQuery( qByCriteria ) );


If I do batch load by an empty Criteria like below, I get NullPointerException in afterLookUp() as TestB is null.

Criteria criteria = new Criteria();
QueryByCriteria qByCriteria = new QueryByCriteria( TestA.class, criteria );
return broker.getCollectionByQuery( qByCriteria );

Following are the classes and mappings.

public class TestA extends OJBDomainImpl implements PersistenceBrokerAware
{

    private TestB testB;
    private Integer testBId;

    public TestB getTestB()
    {
        return testB;
    }

    public void setTestB(TestB testB)
    {
        this.testB = testB;
    }

    /**
     * this method is called as the first operation before perform an
     * object update.
     */
public void beforeUpdate(PersistenceBroker broker) throws PersistenceBrokerException {

    }

    /**
     * this method is called as the last operation within an update
     * operation.
     */
public void afterUpdate(PersistenceBroker broker) throws PersistenceBrokerException {

    }

    /**
     * this method is called as the first operation before perform an
     * object insert.
     */
public void beforeInsert(PersistenceBroker broker) throws PersistenceBrokerException {

    }

    /**
     * this method is called as the last operation within an insert
     * operation.
     */
public void afterInsert(PersistenceBroker broker) throws PersistenceBrokerException {

    }

    /**
     * this method is called as the first operation within a call to
     * PersistenceBroker.delete(...).
     */
public void beforeDelete(PersistenceBroker broker) throws PersistenceBrokerException {

    }

    /**
     * this method is called as the last operation within a call to
     * PersistenceBroker.delete(...).
     */
public void afterDelete(PersistenceBroker broker) throws PersistenceBrokerException {

    }

    /**
     * this method is called as the last operation within a call to
     * PersistenceBroker.getObjectByXXX() or
     * PersistenceBroker.getCollectionByXXX().
     */
public void afterLookup(PersistenceBroker broker) throws PersistenceBrokerException
    {
System.out.println(" Retrieved Test B's name : "+ testB.getName());
    }
}

public class TestB  extends OJBDomainImpl
{
    private String name;

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }
}

<class-descriptor class="com.wbbs.model.TestA" table="TEST_A">
    <field-descriptor
        name="id"
        column="ID"
        jdbc-type="INTEGER"
        primarykey="true"
        autoincrement="true"
        />
    <field-descriptor
        name="testBId"
        column="TESTB_ID"
        jdbc-type="INTEGER"
        />
    <reference-descriptor
        name="testB"
        class-ref="com.wbbs.model.TestB"
        auto-retrieve="true"
        auto-update="true"
        auto-delete="false"
        >
    <foreignkey field-ref="testBId"/>
     </reference-descriptor>
</class-descriptor>

<class-descriptor class="com.wbbs.model.TestB" table="TEST_B">
    <field-descriptor
        name="id"
        column="ID"
        jdbc-type="INTEGER"
        primarykey="true"
        autoincrement="true"
        />
    <field-descriptor
        name="name"
        column="NAME"
        jdbc-type="VARCHAR"
        />
</class-descriptor>


Same testes work fine with OJB o.98.

Please help..

Regards

Ravi



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



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



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

Reply via email to