serialization - ¿Cuál es la mejor manera de guardar mis POJOs en Jackrabbit JCR?
(5)
Es posible que desee echar un vistazo a Jackrabbit OCM que está vivo y pateando. Por supuesto, otra forma es serializar / deserializar manualmente los POJO. Para eso hay muchas opciones diferentes. La pregunta es si necesita un esquema de arreglos para consultar los objetos en JCR. Si solo desea serializar en XML, XStream es una forma muy sencilla de hacerlo. Si necesita un esquema de corrección adicional, también existe Betwixt de Apache Commons.
En Jackrabbit he experimentado dos formas de guardar mis POJOs en nodos de repositorio para el almacenamiento en Jackrabbit JCR:
- escribiendo mi propia capa y
- usando Apache Graffito
Escribir mi propio código ha probado ser lento y laborioso (tuve que escribir y ejecutar muchas pruebas automatizadas feas) aunque bastante flexible.
Usar Graffito ha sido una decepción porque parece ser un proyecto "muerto" atrapado en 2006
¿Cuáles son algunas mejores alternativas?
Depende de tus necesidades. Cuando usa directamente javax.jcr.node, significa que su código está fuertemente acoplado al mecanismo subyacente. En proyectos medianos e incluso pequeños, esta no es una buena idea. Obviamente, la pregunta será cómo pasar del Nodo a su propio modelo de dominio. El problema es bastante similar al pasar de Jdbc ResultSet a su propio modelo de dominio. Eso sí, quiero decir, desde el punto de vista técnico, que el problema es similar. Desde un punto de vista funcional, existen enormes diferencias entre el uso de JDBC y JCR.
Otro factor decisivo es si puede imponer una estructura en su contenido JCR o no. Algunos dominios de aplicación pueden (pero aún combinan mejor con JCR que JDBC), en otros dominios el contenido puede ser de naturaleza altamente desestructurada. En tal caso, OCM es claramente excesivo. Aún así, me gustaría escribir tu propia capa de envoltura alrededor de las clases javax.jcr. *.
También hay https://github.com/ilikeorangutans/omf , un objeto muy flexible para el mapeador JCR. Lamentablemente, todavía no tiene soporte de escritura. Sin embargo, estamos utilizando con éxito este marco en una gran instalación de CMS.
También está el proyecto JCROM en http://code.google.com/p/jcrom/ . Ese proyecto quedó inactivo durante un par de años, pero ha habido algunos lanzamientos nuevos a partir del verano de 2013.
Otra alternativa es omitir por completo un marco de OCM y simplemente usar javax.jcr.Node
como un DAO muy flexible. La razón fundamental por la que existen los marcos OCM es porque con RDBMS necesita una asignación de objetos al modelo relacional. Con JCR, que ya está muy orientado a objetos (nodo ~ = objeto), esta razón subyacente se ha ido. Lo que queda es que con los DAO puede restringir lo que los programadores pueden acceder en su código (incluida la ayuda de autocompletado). Pero este enfoque no aprovecha el concepto de JCR, lo que significa una programación flexible y sin esquemas . Usar la API de JCR directamente en su código es la mejor manera de seguir ese concepto.
Imagine que desea agregar una nueva propiedad a un nodo / objeto existente más adelante en la vida de su aplicación: con un marco OCM también debe modificarlo y asegurarse de que todavía funciona correctamente. Con acceso directo a los nodos, es simplemente un único punto de cambio. Lo sé, esta es una buena manera de obtener problemas con los errores tipográficos, por ejemplo. nombres de propiedad; pero este temor en realidad no está respaldado por la realidad, ya que en la mayoría de los casos notarás muy rápidamente los errores de ortografía o los nombres que no coinciden cuando pruebas tu aplicación. Una buena solución es usar constantes de cadena para los nombres comunes de nodo o propiedad, incluso como parte de sus API si expone la API JCR a través de ellas. Esto todavía le da la flexibilidad de agregar rápidamente nuevas propiedades sin tener que adoptar capas OCM.
Para tener algunas restricciones sobre lo que está permitido o lo que es obligatorio (es decir, "semi-schema") puedes usar tipos de nodos y mixins (desde JCR 2.0 también puedes cambiar el tipo de nodo para contenido existente): así puedes manejar esto completamente en el nivel del repositorio y no tiene que preocuparse por escribir y restricciones dentro del código de la aplicación, además de detectar las excepciones ;-)
Pero, por supuesto, esta elección depende de sus requisitos y preferencias personales.