I'm using 0.9.7 one of our developers is having a strange cache problem:
when I get an object, change its primary key to 0, store it (it then
creates a new row with a new primary key in the database), then retrieve
the original object, it returns the wrong one.
For example, I get object ID 1. I then set its primary key to 0, store
it, thus creating a new object. Now I try to get object ID 1 again, and
it returns instead the new record I just created, even though it doesn't
even match the primary key I just used. Calling broker.clearCache()
makes it works, but calling broker.removeFromCache(app) doesn't do
anything. Is there a better solution that flushing the whole cache to
make this situation work? Another thing of note, is that the SQL
generated on the getById() is the correct SQL - it's just the cache is
confused and returning the wrong object.
Application app =
AppManager.getById(form.getApplication_id());
int parAppID = app.getApplication_id();
app.setApplication_id(0);
broker.store(app);
broker.clearCache();
Applications application = getById(parAppID); // without
the clearCache, it returns the object I just stored, which has a
different pri key
public static Applications getById(int appId) {
Applications app = null;
Criteria criteria = new Criteria();
criteria.addEqualTo(Applications.APPLICATION_ID, new
Integer(appId));
Query query = new QueryByCriteria(Applications.class, criteria);
try {
PersistenceBroker broker = getBroker();
app = (Applications) broker.getObjectByQuery(query);
} catch (Exception e) {
Log.error(Applications.class, "Error getById()", e);
}
return app;
}
// xml object (no foreign keys or anything funky)
<class-descriptor
class="com.xxx.xxx2.beans.Applications"
table="XXX_APPLICATIONS"
>
<field-descriptor id="1"
name="application_id"
column="APPLICATION_ID"
jdbc-type="INTEGER"
primarykey="true"
autoincrement="true"
/>
<field-descriptor id="2"
name="application_name"
column="APPLICATION_NAME"
jdbc-type="VARCHAR"
/>
<field-descriptor id="3"
name="application_description"
column="APPLICATION_DESCRIPTION"
jdbc-type="VARCHAR"
/>
<field-descriptor id="4"
name="version"
column="VERSION"
jdbc-type="VARCHAR"
/>
<field-descriptor id="5"
name="registration_date"
column="REGISTRATION_DATE"
jdbc-type="TIMESTAMP"
/>
<field-descriptor id="6"
name="catalog_flag"
column="CATALOG_FLAG"
jdbc-type="VARCHAR"
/>
<field-descriptor id="7"
name="catalog_entry_date"
column="CATALOG_ENTRY_DATE"
jdbc-type="TIMESTAMP"
/>
<field-descriptor id="8"
name="pending_flag"
column="PENDING_FLAG"
jdbc-type="VARCHAR"
/>
<field-descriptor id="9"
name="certification_flag"
column="CERTIFICATION_FLAG"
jdbc-type="VARCHAR"
/>
<field-descriptor id="10"
name="certification_date"
column="CERTIFICATION_DATE"
jdbc-type="TIMESTAMP"
/>
<field-descriptor id="11"
name="rejected_reason"
column="REJECTED_REASON"
jdbc-type="VARCHAR"
/>
<field-descriptor id="12"
name="launch_date"
column="LAUNCH_DATE"
jdbc-type="TIMESTAMP"
/>
<field-descriptor id="13"
name="application_status_change_date"
column="APPLICATION_STATUS_CHANGE_DATE"
jdbc-type="TIMESTAMP"
/>
<field-descriptor id="14"
name="revenue_generated"
column="REVENUE_GENERATED"
jdbc-type="VARCHAR"
/>
<field-descriptor id="15"
name="pricing"
column="PRICING"
jdbc-type="VARCHAR"
/>
<field-descriptor id="16"
name="user_id"
column="USER_ID"
jdbc-type="INTEGER"
/>
<field-descriptor id="17"
name="created_by"
column="CREATED_BY"
jdbc-type="VARCHAR"
/>
<field-descriptor id="18"
name="created_date"
column="CREATED_DATE"
jdbc-type="TIMESTAMP"
/>
<field-descriptor id="19"
name="updated_by"
column="UPDATED_BY"
jdbc-type="VARCHAR"
/>
<field-descriptor id="20"
name="certification_type_id"
column="CERTIFICATION_TYPE_ID"
jdbc-type="INTEGER"
/>
<field-descriptor id="21"
name="status_id"
column="STATUS_ID"
jdbc-type="INTEGER"
/>
<field-descriptor id="22"
name="updated_date"
column="UPDATED_DATE"
jdbc-type="TIMESTAMP"
/>
<field-descriptor id="23"
name="pending_modification_id"
column="PENDING_MODIFICATION_ID"
jdbc-type="INTEGER"
/>
</class-descriptor>