Datanucleus – JDO valores nulos depués de la primer consulta

Recientemente empecé a utilizar Datanucleus para simplificar la persistencia y consulta de datos. Uno de los primeros problemas que tuve fue que al realizar una consulta por segunda vez, las propiedades del objeto eran nulas. Esto se debe al ciclo de vida de los objetos en Datanucleus, el cuál aparece en el log de la siguiente manera

13:07:41,197 DEBUG [DataNucleus.Lifecycle] – Object «mx.com.apestudio.videohaus.server.model.Video@6eb5ec12» (id=»mx.com.apestudio.videohaus.server.model.Video:bb56da010129448ab28f4486d32036b9    «) has a lifecycle change : «P_CLEAN»->»HOLLOW»

al cambiar del estado P_CLEAN a HOLLOW todas las propiedades, excepto la llave primaria, son reestablecidas a un valor nulo. Para evitar que esto suceda, podemos establecer la propiedad RetainValues a true en el archivo de configuración datanucleus.properties

datanucleus.RetainValues=true

al hacer esto, el log muestra lo siguiente

14:05:37,400 DEBUG [DataNucleus.Lifecycle] – Object «mx.com.apestudio.videohaus.server.model.Video@795cd696» (id=»mx.com.apestudio.videohaus.server.model.Video:bb56da010129448ab28f4486d32036b9    «) has a lifecycle change : «P_CLEAN»->»P_NONTRANS»

ahora el objeto pasó de un estado P_CLEAN a P_NONTRANS y conservó todas las propiedades con los valores obtenidos al realizar la primer consulta. Este modo es conveniente si sólo vas a realizar operaciones de lectura.

La otra opción es establecer la propiedad DetachAllOnCommit que, aunque es un poco mas costosa en cuanto a rendimiento, hace un ‘detach’ y ‘re-attach’ automático de los objetos. Esto es especialmente útil si vamos a actualizar alguna propiedad del objeto y queremos persistir los cambios.

datanucleus.DetachAllOnCommit=true

estas propiedades también podemos establecerlas mediante los métodos correspondientes del objeto PersistenceManager.

Cabe destacar que el problema de los valores nulos se presenta sólo cuando queremos leer propiedades del objeto fuera del contexto de una transacción.

Fuentes:
http://stackoverflow.com/questions/4630142/datanucleus-jdo-setting-fields-to-null
http://www.datanucleus.org/products/datanucleus/jdo/object_lifecycle.html
http://www.datanucleus.org/products/datanucleus/persistence_properties.html#RetainValues  
http://www.datanucleus.org/products/accessplatform_3_1/jdo/performance_tuning.html#Reading_persistent_objects_outside_a_transaction_and_PersistenceManager