Hi ojb-users, similar problem was already discussed in following thread:
http://www.mail-archive.com/ojb-user@db.apache.org/msg14793.html. As I see from: ObjectEnvelope.removedXToN(CollectionDescriptor, Object, Identity) An ImageException "Unexpected behaviour, unregistered object performed …" is thrown because referenced object was not registered (and locked) and ObjectEnvelope is null in that case (as a result of implicitLocking=false). Of course I’m aware of the fact that in this case the user should take responsibility for locking and registering objects within odmg-transaction. I’m wondering if this method should really check if referenced object was registered with transaction and implicitly register it in a similar way as it is done in: ObjectEnvelope.addedXToN(CollectionDescriptor, Object, Identity) ObjectEnvelope mod = buffer.getByIdentity(oid); // if the object isn't registered already, it can be 'new' or already 'persistent' if(mod == null) { mod = buffer.get(new RuntimeObject(refObjOrProxy, oid, getTx())); } This problem can be reproduced if we drop new test method in org.apache.ojb.odmg.ObjectImageTest. For example: public void testImageExceptionOnRemovingReferenced() { String name = "testImageExceptionOnRemovingReferenced_" + System.currentTimeMillis(); Date date = new Date(); byte[] cover = new byte[]{2,3,4,5,6,7,8,9}; Book book = new Book(name, date, cover); Review r1 = new Review(name); TransactionExt tx = (TransactionExt) odmg.newTransaction(); tx.begin(); database.makePersistent(book); database.makePersistent(r1); tx.commit(); /* add without implicit locking - should pass */ tx = (TransactionExt) odmg.newTransaction(); tx.setImplicitLocking(false); tx.begin(); tx.lock(book, Transaction.WRITE); book.addReview(r1); tx.commit(); /* remove without implicit locking - fails */ tx = (TransactionExt) odmg.newTransaction(); tx.setImplicitLocking(false); tx.begin(); tx.lock(book, Transaction.WRITE); book.removeReview(r1); tx.commit(); } Best regards, Mario Curcija