Ventajas de usar un tipo específico para los identificadores de las entidades en vez de un tipo básico
Escrito por
el .
java
planeta-codigo
programacion
Enlace permanente
Comentarios
Al persistir una entidad de dominio en la base de datos su identificador se guarda como un tipo de datos soportado por la base de datos. Si es una base de datos relacional habitualmente es el equivalente a un bigint o en una base de datos de documentos quizá un UUID. En las entidades de dominio el tipo de datos usado para el identificador es el equivalente de la base de datos en el lenguaje de programación. Por ejemplo, si en una base de datos la clave primaria es un bigint el identificador en la entidad de dominio es un Long. Esto es lo mas simple pero tiene algún inconveniente.
El inconveniente es que al ser el identificador un tipo de datos básico cualquier Long es aceptado, con lo que se hacen posibles errores o malos comportamientos al usar un identificador de otra entidad de dominio si también es un Long donde no se debería. El compilador no captura este tipo de errores porque entiende como correcto cualquier Long independientemente de su significado desde el punto de vista de la aplicación.
También en cierta medida es un problema en la legibilidad del código ya que el tipo de dato de una variable no es significativo para saber si es un identificador. También es un problema al trabajar con colecciones, los siguientes ejemplos de código demuestran que los tipos no son todo lo semánticos o significativos que deberían.
|
|
La solución es crear un tipo para cada identificador de cada entidad y en vez de usar un Long pasar a usar un ProductoId, UsuarioId, CompraId o como en el ejemplo EventId. Estas serían unas posibles implementaciones.
|
|
|
|
|
|
El tipo de las colecciones ahora son más semánticas además de que el compilador realizará comprobaciones de tipos.
|
|
En la popular herramienta ORM de persistencia Hibernate o JPA se puede usar el tipo propio para el identificador usando la anotación @Converter y en otra alternativa de persistencia para Java como jOOQ especificando en el generador el tipo que se quiere usar para una columna. En ambos casos hay que proporcionar una implementación que convierta del tipo de la base de datos al del identificador en el dominio y viceversa. Son muy simples.
|
|
|
|
En una entidad de Hibernate los identificadores se definen de la siguiente forma.
|
|
En jOOQ en la configuración del generador hay que especificar que para un campo se use un converter.
|
|
Con un tipo de datos propio para los identificadores es muy importante implementar correctamente los métodos equals y hashCode tanto en clases de identificadores como en las entidades de dominio ya que las colecciones de Java se basan en estos métodos para determinar si una colección contiene un elemento.
En el artículo generar en el dominio los identificativos de las entidades aplicando DDD antes de persistirlas en la base de datos muestro un ejemplo completo y funcional implementando este principio de usar un tipo específico para representar la clave primaria de la entidad.