protected static void initSaveOrUpdateEventListenerHook( Configuration config ) { Listl = new ArrayList ( ) ; SaveOrUpdateEventListener[ ] listeners = config.getEventListeners( ).getSaveOrUpdateEventListeners( ) ; l.add( new DefaultSaveOrUpdateEventListener( ) { @Override public void onSaveOrUpdate( org.hibernate.event.SaveOrUpdateEvent arg0 ) { try { super.onSaveOrUpdate( arg0 ) ; } catch( RuntimeException e ) { e.printStackTrace( ) ; try { Object pc = arg0.getSession( ).getPersistenceContext( ) ; Map m = ( Map )getField( pc, "parentsByChild" ) ; // System.err.println( "Map size: " + m.size( ) + ", " + m ) ; StringBuilder sb = new StringBuilder( ) ; int cnt = 0 ; Map.Entry[] list = IdentityMap.concurrentEntries( m ) ; for( Map.Entry me : list ) { YBean childBean = ( YBean )me.getKey( ) ; YBean parentBean = ( YBean )me.getValue( ) ; sb.append( "item " + cnt++ + " is " + parentBean.getClass( ).getSimpleName( ) + "#" + parentBean.getId( ) + ", child is " + childBean.getClass( ).getSimpleName( ) + "#" + childBean.getId( ) + " \n" ) ; } System.err.println( "the child parent Map is " + sb ) ; } catch( Exception e1 ) { e1.printStackTrace( ) ; YEmergencyEmail.sendErrorMessage( e1, "Error on child parent map mailing", null ) ; } } ; @Override protected boolean reassociateIfUninitializedProxy( Object object, SessionImplementor source ) { // System.err.println( "Object is ************* " + object ) ; try { return super.reassociateIfUninitializedProxy( object, source ) ; } catch( RuntimeException e ) { e.printStackTrace( ) ; try { YBean bean = ( YBean )object ; String uid = "UID_" + System.nanoTime( ) ; int hashCode = -1 ; if( bean instanceof HibernateProxy ) { HibernateProxy prox = ( HibernateProxy )bean ; hashCode = prox.getHibernateLazyInitializer( ).getSession( ).hashCode( ) ; Exception sessionTrace = HibernateManager.getSessionTracePool( ).get( hashCode ) ; System.err.println( "uid : ========================= session is from =========================== " ) ; sessionTrace.printStackTrace( ) ; YEmergencyEmail.sendErrorMessage( sessionTrace, "Session " + hashCode + "uid 3:" + uid + "session is from", "uid:" + uid + " session is from reassociateIfUninitializedProxy " ) ; } } catch( Exception e2 ) { e2.printStackTrace( ) ; YEmergencyEmail.sendErrorMessage( e2, "Error on cachting exception in reassociateIfUninitializedProxy", null ) ; } throw e ; } } } ) ; l.addAll( Arrays.asList( listeners ) ) ; SaveOrUpdateEventListener[ ] newListeners = l.toArray( new SaveOrUpdateEventListener[ l.size( ) ] ) ; config.getEventListeners( ).setSaveOrUpdateEventListeners( newListeners ) ; }
Saturday, August 15, 2015
illegally attempted to associate a proxy with two open Sessions
We were having this exception in a very complicated process where hundreds of objects were being saved or updated in a single work unit.(No it was natural system was so)
If this happens in simple block or hibernate gives any clue it is easy to solve. But sometimes there is no clue so we wrote a DefaultSaveOrUpdateEventListener.
As we guess it is because of parentsByChild ( Parent entities cache by their child for cascading ) map at PersistenceContext we wrote a code at bottom.
It checks for the item that get exception and which beans are waiting for cascade.
This revealed us the problem.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment