1.-¿Qué sucede cuando almacenamos un objeto?
Al almacenar un objeto en db4o se observan entre otros los siguientes comportamientos, que pueden parecer anómalos si no se entiende lo que sucede:- No se respeta la integridad referencial, es decir podemos guardar el mismo objeto tantas veces como queramos. La explicación a esto es que cuando usamos el método store db4o crea un nuevo OID (si estuviéramos ante una BD relacional lo consideraríamos la clave primaria) y se le asigna al objeto que acabamos de guardar por este motivo es posible almacenar el mismo objeto tantas veces como queramos sin violar la integridad referencial.
- Cuando un objeto tiene entre sus atributos referencias a otros objetos (componentes) se guardan también dichos objetos en la base de datos. Esto se debe a que al guardar un objeto compuesto db4o aplica el equivalente al método store a cada uno de los objetos componente que lo forman lo que unido a lo expuesto en el punto anterior puede dar lugar a un despilfarro de espacio en memoria muy considerable. Otra consecuencia de esto es que si por algún motivo db4o no logra guardar alguno de los objetos componente la referencia a este en el objeto compuesto tomará valor null en la BD y al recuperarlo nos puede saltar el obvio NullPointerException.
2.-¿Como crear integridad referencial?
La forma de crear un modelo de integridad referencial en nuestra aplicación es mediante la gestión de los eventos de interacción con la BD. Para esto la API de db4o pone a nuestra disposición la interfaz EventRegistry, que permite crear un gestor para los eventos relacionados con la persistencia, facilitándonos la labor de cancelar una inserción o desencadenar un borrado en cascada ante el borrado de un objeto.
En el siguiente fragmento de código se crea una conexión a la BD y se asocian unos listener a los eventos de creación y borrado tal como se ven en la imagen.
![]() | ||
Asociación de listeners para eventos de creación y borrado de objetos |
A continuación se muestran en una serie de imágenes las distintas partes que componen un listener de ejemplo que controla los procesos de inserción.
En primer lugar nuestra clase listener debe implementar la interfaz EventListener4<CancellableObjectEventArgs> para que podamos cancelar el proceso si queremos.
![]() | ||
Declaración de la clase |
![]() |
Comprobación de que no existe el objeto en la base de datos |
![]() | |
Método retrieveUsuario |
![]() | ||
Comprobación de la existencia de los objetos referenciados desde el objeto que se está almacenando. |
Por último solo queda comprobar si el boolean ilegal sigue siendo true y de ser así cancelar la inserción.
![]() | |
Cancelo la inserción si ilegal sigue siendo true |
Con lo anterior queda resuelto el problema de integridad referencial.
Si a alguien le interesa descargarse el proyecto de netbeans donde desarrollo el ejemplo que esté pendiente porque en los próximos días lo subiré a esta misma entrada.
Muy buen aporte, espero que subas el proyecto, me interesa el tema, gracias!!
ResponderEliminar