with primary must has foreign example data annotation jpa composite-primary-key

must - spring jpa entity composite primary key



Claves JPA/Hibernate y compuestas (1)

He encontrado algunas discusiones de SO y otras (por ejemplo aquí , aquí y aquí ) donde el uso de claves primarias compuestas con JPA se describe como algo que debe evitarse si es posible o como una necesidad debido a bases de datos heredadas o como "peludas" casos de esquina. Ya que estamos diseñando una nueva base de datos desde cero y no tenemos problemas heredados para considerar, ¿es recomendable o mejor dicho, más seguro, evitar las claves primarias compuestas con JPA (ya sea Hibernate o EclipseLink ?).

Tengo la sensación de que, dado que los motores JPA son lo suficientemente complejos y, sin duda, como todo software, no sin errores, puede ser mejor sufrir tablas no normalizadas que soportar el horror de correr contra un error relacionado con claves primarias compuestas (la razón fundamental) siendo que las claves primarias numéricas de una sola columna y las claves externas son el caso de uso más sencillo para los motores JPA, por lo que deben estar libres de errores tanto como sea posible).


Probé ambos métodos, y personalmente prefiero evitar claves primarias compuestas por varias razones:

  • Puede crear una superclase que contenga el campo de ID, para que no tenga que preocuparse por ella en todas sus entidades.
  • La creación de entidades se vuelve mucho más fácil
  • JPA juega mejor en general
  • Hacer referencia a una entidad se vuelve más fácil. Por ejemplo, almacenar un grupo de ID en un conjunto, o especificar un único ID en la cadena de consulta de una página web, se simplifica enormemente al tener que usar un solo número.
  • Puede usar un único método igual especificado en la superclase que funcione para todas las entidades).
  • Si usas JSF puedes hacer un convertidor genérico
  • Más fácil de especificar objetos cuando se trabaja con su cliente de base de datos

Pero también trae algunas partes malas:

  • Pequeña cantidad de desnormalización
  • Trabajar con objetos sin columnas (si usa identificadores generados automáticamente, lo cual debería) puede significar problemas en algunos casos, ya que los métodos de igualdad y tales necesitan una ID para funcionar correctamente