Re: lifecycle callbacks not always fired

From: Lachlan Deck (lachlan.dec..mail.com)
Date: Wed Mar 14 2007 - 21:52:47 EDT

  • Next message: jerome moliere: "Re: [OT] Maven in Cayenne"

    On 15/03/2007, at 12:15 AM, Andrus Adamchik wrote:

    > One last try at guessing it. On the server you have to do some
    > magic to enable callbacks (hopefully eventually this will be more
    > transparent). See "Enabling Callbacks" chapter at the bottom of
    > this page:
    >
    > http://cayenne.apache.org/doc/lifecycle-callbacks.html
    >
    > if this doesn't help, please file a bug with code samples.

    This is what we're doing... It seems to be in line with the above
    page. Any ideas?

    public class DatabaseConnector {

            // Note: Maps is just a util class of mine that populates a HashMap
            private static final Map LIFECYCLE_CALLBACKS = Maps.asMap(
                    new String[] {
                        "postLoad", "postPersist", "postRemove", "postUpdate",
    "prePersist", "preRemove", "preUpdate"
                    },
                    new Object[] {
                            new Integer( LifecycleListener.POST_LOAD ),
                            new Integer( LifecycleListener.POST_PERSIST ),
                            new Integer( LifecycleListener.POST_REMOVE ),
                            new Integer( LifecycleListener.POST_UPDATE ),
                            new Integer( LifecycleListener.PRE_PERSIST ),
                            new Integer( LifecycleListener.PRE_REMOVE ),
                            new Integer( LifecycleListener.PRE_UPDATE )
                    }
            );

            private Number connectionStatus;
            private DataDomain dataDomain;
            private DataContext dataContext;

            public DatabaseConnector() {
                    dataDomain = null;
                    dataContext = null;
                    setConnectionStatus( DB_CONNECTION_STATE_DISCONNECTED );
                    try {
                            logger.info( "initializing configuration..." );
                            Configuration.initializeSharedConfiguration();
                            Configuration conf = Configuration.getSharedConfiguration();
                            dataDomain = conf.getDomain();
                            setupListeners();
                            // dataDomain.setTransactionDelegate(new
                            // DomainTransactionDelegate());
                            logger.info( "creating shared data context..." );
                            dataContext = dataDomain.createDataContext();
                            setConnectionStatus( DB_CONNECTION_STATE_ESTABLISHED );
                            logger.info( "Database connection established..." );
                    }
                    catch ( ConfigurationException e ) {
                            dataDomain = null;
                            dataContext = null;
                            setConnectionStatus( DB_CONNECTION_STATE_FAILED );
                            logger.error( "Configuration exception occured while connecting to
    database", e );
                            throw new RuntimeException( "Could not connect to database server.
    Please check the configuration." );
                    }
                    catch ( Exception e ) {
                            dataDomain = null;
                            dataContext = null;
                            setConnectionStatus( DB_CONNECTION_STATE_FAILED );
                            logger.error( "Exception occured while connecting to database", e );
                            throw new RuntimeException( "Could not connect to database server.
    Please check the logs." );
                    }
            }

            protected void setupListeners()
            {
                    LifecycleCallbackRegistry registry;
                    Iterator callbacksIter;

                    registry = dataDomain.getEntityResolver().getCallbackRegistry();
                    callbacksIter = LIFECYCLE_CALLBACKS.keySet().iterator();
                    while ( callbacksIter.hasNext() ) {
                            String aMethodName = ( String )callbacksIter.next();
                            Integer type = ( Integer )LIFECYCLE_CALLBACKS.get( aMethodName );
                            logger.debug( "add lifecycle callback:" + aMethodName + " type:" +
    type );
                            registry.addListener( type.intValue(),
    our.subclass.of.CayenneDataObject.class, aMethodName );
                    }
                    
            }
            <...>
    }

    with regards,

    --
    

    Lachlan Deck



    This archive was generated by hypermail 2.0.0 : Wed Mar 14 2007 - 21:53:39 EDT