From: Tomasz B. (JIRA) <no...@at...> - 2006-05-09 06:49:24
|
[ http://opensource.atlassian.com/projects/hibernate/browse/HHH-1725?page=comments#action_23052 ] Tomasz Bech commented on HHH-1725: ---------------------------------- I think there is small issue with current implementation (a bug?). Scenario is: object A has reference to B (lazy), B has collection C. when in preInsert a.getB().getAnyProperty() is called the flush is raising exception 'collection b.c was not processed by flush()'. (it is not rising exception like 'property b was not processed by flush()' - so the problem is only when there is lazy property which has at least ONE collection). The collection C isn't even accessed, used, etc. The exception is to avoid situation of usage/modififcation of collection, and it isn't the case. So shouldn't following function : CollectionEntry: public void postFlush(PersistentCollection collection) throws HibernateException { if ( isIgnore() ) { ignore = false; } else if ( !isProcessed() ) { throw new AssertionFailure( "collection [" + collection.getRole() + "] was not processed by flush()" ); } collection.setSnapshot(loadedKey, role, snapshot); } check also if collection was initialized? Like this: public void postFlush(PersistentCollection collection) throws HibernateException { if ( isIgnore() ) { ignore = false; } else if (collection.wasInitialized() && !isProcessed() ) { throw new AssertionFailure( "collection [" + collection.getRole() + "] was not processed by flush()" ); } collection.setSnapshot(loadedKey, role, snapshot); } In this case the real (currently prohibited by Hibernate) usage of collections in flush will be reported. > lazy properties, events and collection xxx was not processed by flush exception and EJB3 incompatibility > -------------------------------------------------------------------------------------------------------- > > Key: HHH-1725 > URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-1725 > Project: Hibernate3 > Type: Bug > Components: core > Versions: 3.2.0.cr2 > Reporter: Tomasz Bech > > > It is realted to anomaly: http://opensource.atlassian.com/projects/hibernate/browse/HHH-1540 > 'When using custom event listeners, sometimes you mess with (and initialize) lazy collections by mistake, which causes CollectionEntry.postFlush(PersistentCollection) to throw an AssertionFailure' > It is questionable why AT ALL exception is raised in this case! > What is the most important: EJB3 spec is not prohibiting to check/read/ object involved in the event, so current implementation is agains EJB3 spec. > Events are often used for validation so it is quite probable that the lazy property (collection) has to be accessed - and when it is lazy and not initialized before the exception is raised. Why hibernate cannot treat it in nicer way and allow such actions. > One workaround is to not-use-lazy (very bad). > Second workaround: in the code outside flush (not in event) pre-initialize all lazy properties (in fact simulation of 'not-lazy). -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira |