Generación de objetos de traducción de artículos: un mejor enfoque de integración de Hibernate
Hibernate está diseñado para facilitar la persistencia de casi cualquier objeto Java ordinario (POJO). Crear un objeto persistente es muy simple y el enfoque clásico (es decir, la recomendación de la Asociación Hibernate) se puede resumir en dos pasos:
Elija una clave comercial e implemente códigos hash e igualdad en el camino hacia el objeto. . Una clave de negocio es una determinada combinación de áreas de negocio fijas que no sólo es única sino que también se garantiza que no cambiará durante todo su ciclo de vida. Se utiliza para identificar objetos y probar la igualdad.
Escribe la descripción del mapeo de Hibernación. Campos de mapeo comunes para columnas y tablas de objetos en una base de datos. Los descriptores pueden tener muchas formas, pero normalmente se proporcionan como archivos XML.
Los ejemplos simples en la Tabla 1, Tabla 2 y Tabla 3 ilustran este proceso:
El Listado 1 es el código Java para un usuario simple que es un usuario de trabajo, representado por Trail activado. En este ejemplo, se seleccionó la dirección de correo electrónico del usuario como foco comercial del objeto. El aviso explica cómo utilizar este código hash y el método de igualdad al realizarlo.
La Lista 2 es la descripción de Hibernación correspondiente. En pocas palabras, los campos y objetos de mapeo se asignan directamente a columnas en la base de datos.
El Listado 3 es el esquema de la tabla de la base de datos subyacente. Tenga en cuenta que la identidad es la clave principal, no la dirección de correo electrónico. Esto se denomina clave sustituta y es la misma práctica recomendada para el diseño de bases de datos.
Si bien es eficaz, el enfoque clásico también tiene algunos defectos importantes. El primer paso (elegir un enfoque empresarial e implementar códigos hash y métodos de igualdad) causa problemas a muchos desarrolladores de Java por las siguientes razones:
Muchos, si no la mayoría, de los objetos Java no tienen una clave empresarial conveniente. Esto es obvio incluso en la clase de usuario de ejemplo. La dirección de correo electrónico se utiliza como clave comercial, pero no es apropiada ya que el usuario debería poder cambiarla fácilmente. De hecho, joder, casi todos los campos se pueden cambiar. Por lo general, esto requiere algunas soluciones para que estos objetos se ajusten al modelo. Verá estas soluciones tanto en los propios objetos como en el código utilizado para administrarlos.
Implementar códigos hash y métodos de igualdad para objetos persistentes en todo el proyecto es engorroso y propenso a errores. Es simplemente un código más extraño que necesitas escribir, probar y mantener.
Las claves empresariales suelen estar compuestas por una orquesta de cuerdas. Tenga en cuenta que los códigos hash y los métodos de igualdad se utilizan a menudo entre bastidores y, si bien el rendimiento puede no ser un problema, lo será si estas cadenas son largas y similares. Además, es posible que haya estado buscando una optimización sencilla.
Afortunadamente, estos problemas se pueden solucionar con un nuevo método de integración de hibernación.
Hibernate Perseverance: un enfoque generativo
La generación de objetos es un enfoque diferente a la integración de Hibernate. En lugar de proporcionar códigos hash personalizados y métodos equivalentes para cada objeto, los objetos se identifican mediante una clave sustituta en lugar de una clave comercial. El concepto es simple, pero la implementación requiere cierta comprensión e infraestructura.
Una clave sustituta es un identificador único para cada fila de una tabla específica. Si observa el proyecto anterior, verá que se usa como columna de ID en la tabla de usuarios y genera valores junto con su secuencia complementaria. Esto significa que cada objeto de usuario persistente tendrá su propio identificador entero único.
Las claves sustitutas parecen una elección natural para los identificadores de objetos, no son más que un problema técnico: normalmente el objeto no obtiene su valor hasta que persiste en la base de datos. Esto significa que las adiciones que recopilan el objeto antes de que persista fallarán (llamadas de recopilación al código hash y métodos iguales detrás de escena).
La solución es utilizar el generador de objetos para modificar el objeto de acceso a datos (tracto) de modo que el identificador se recupere y asigne cuando se crea el objeto. Diséñelo como una hibernación de fábrica de objetos. Cada objeto devuelto por el generador tiene una base de datos que genera un identificador que se garantiza que es estable y único. La diferencia clave, el problema y el enfoque típico entre los dos es que antes de que algo de esto suceda, el propósito es persistir.
Para lograr una integración perfecta con Hibernate, se deben cumplir algunos requisitos de infraestructura. Cada uno de los siguientes elementos es relativamente simple, pero requiere una planificación cuidadosa:
Una clase base de entidad abstracta. Esta clase contiene códigos hash y métodos de igualdad para todos los objetos persistentes. Estrictamente hablando, esta clase no es necesaria, pero eso no excluye la presencia de código extraño.
El camino hacia la mejora. Este es un generador de objetos que se utiliza para crear objetos después de recuperar y asignar identificadores. Esta clase utiliza los requisitos mencionados en la biblioteca javassist de este artículo. Si nunca ha usado javassist, es una excelente biblioteca de código abierto para crear o mejorar clases en tiempo de ejecución.
Interfaz sencilla para generar entidades. Esta es una interfaz para todas las entidades generadas que se ejecutan en tiempo de ejecución (a través de la biblioteca javassist). Sirve como una interfaz de marcador que contiene varios métodos simples para rastrear el estado persistente de un objeto.
Generador de identificadores personalizados. Este es un generador de identificadores básico que implementa un generador de identificadores de hibernación para comprender la generación y representación de objetos. Es más fácil mostrar que explicar.
Interceptor de hibernación personalizado. Los interceptores optimizan el rendimiento mediante el uso de interfaces de entidades generadas para minimizar las llamadas entrantes a la base de datos.
Afortunadamente, encontrarás que nada de esto es complicado y estás trabajando para la última empresa de Business Objects. Las tareas, junto con un esfuerzo constante, reducen la cantidad de veces que las personas tocan las clases básicas y crean caminos complementarios mínimos. Para el descubrimiento básico a nivel de usuario, en la lista anterior, el código se redujo a una lógica empresarial ligeramente superior a la necesaria:
extensión de usuario de clase ciudadanaabstractgenericentity
(< / p>
correo electrónico de cadena privada;
contraseña de cadena privada;
cadena pública*** getemail () (devolver correo electrónico; )
pública* * * setemail no válido (cadena V) (correo electrónico = clase E;)
public*** string getpassword () (devolver contraseña; )
public*** setpassword no válido (planificación de cadenas ) ( contraseña=fósforo ;)
@override
Última clase de ciudadano
) p >
Notarás que esta clase no contiene códigos hash ni métodos equivalentes. Tampoco contiene un atributo de ID. Todos están incluidos en la clase abstractgenericentity junto con el método getentityclass en la declaración.