Hi Paul,

I assume you use ObjectCacheDefaultImpl for object caching. This implementation is really simple and cache complete object graph (object with all dependencies). So if you add a new book and lookup the library object from OJB, the library will be found in cache, therefore the cached books in the library object will not be updated - until the cached library is timed out or removed from cache.

If you don't want this behavior you can change the used ObjectCache implementation, e.g. use ObjectCachePerBrokerImpl. Or easiest way, set the 'refresh' attribute of the library class collection-descriptor to 'true'.

http://db.apache.org/ojb/docu/guides/repository.html#collection-descriptor-N1059C

regards,
Armin



Paul Timmins wrote:
When I add an object on the "one" side of a 1:N relationship (ie: adding a book), the cached "many" (ie: a library) side is out of synch.

In pseudocode:
1. Access Library 1 and count the number of books (it's now cached)
2. Create a new book, set the book.library_id=1
3. PersistenceBroker.store(book) (book is now inserted)
4. Count the number of books in Library 1

Problem! In step 4, the number of books has not been updated... it's the cached value from step 1, not the correct value.

What is the proper way to deal with this issue? Are we supposed to flush the cache on every write? Or, manually update all the related objects? Or what?

PS: In step 2, I could set the book.library object instead of the FK. Same result.

--------------------
Scenario:
Let's say I have two tables Library and Book, with a FK to Library in Book (therefore, this is a 1:N from Library to books)


Data objects:
public class Library {
 Integer id; // PK
 Collection books; // lazy loaded (Proxy=true)
}

public class Book {
 Integer id;
 Integer library_id; // FK to Library
 Library library;
}

Repository_User.xml:
<class-descriptor
 class="Book"
 table="book">
 <field-descriptor
    name="id"
    column="id"
    jdbc-type="INTEGER"
    primarykey="true"
    autoincrement="true"
    sequence-name="bookid"
 />
 <field-descriptor
    name="library_id"
    column="library_id"
    jdbc-type="INTEGER"
 />
 <field-descriptor
    name="name"
    column="name"
    jdbc-type="VARCHAR"
 />
 <reference-descriptor
   name="Library"
   class-ref="library"
   auto-retrieve="true"
   auto-update="link"
   auto-delete="false">
   <foreignkey field-ref="library_id" />
 </reference-descriptor>
</class-descriptor>

<class-descriptor
 class="Library"
 table="library">
 <field-descriptor
    name="id"
    column="id"
    jdbc-type="INTEGER"
    primarykey="true"
    autoincrement="true"
    sequence-name="libraryid"
 />
 <field-descriptor
    name="name"
    column="name"
    jdbc-type="VARCHAR"
 />
 <collection-descriptor
   name="collbooks"
   element-class-ref="Book"
   auto-retrieve="true"
   auto-update="link"
   auto-delete="false"
   proxy="false">
   <inverse-foreignkey field-ref="library_id"    />
 </collection-descriptor>
</class-descriptor>

_________________________________________________________________
Express yourself instantly with MSN Messenger! Download today - it's FREE! http://messenger.msn.click-url.com/go/onm00200471ave/direct/01/



--------------------------------------------------------------------- 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