tutorial example java hibernate

java - example - Hibernate mapeando una clave compuesta con valores nulos



hibernate jpa (6)

Con Hibernate, ¿puede crear una identificación compuesta donde una de las columnas que está mapeando a la ID puede tener valores nulos?

Esto es para tratar con una tabla heredada que tiene una clave única que puede tener valores nulos pero no clave primaria.

Me doy cuenta de que podría agregar una nueva columna de clave principal a la tabla, pero me pregunto si hay alguna forma de evitar hacer esto.


¿Por qué querrías hacer eso? Su identificación compuesta debe mapear la clave principal de su tabla, y no parece acertado poner valores nulos en una clave, ¿verdad?

EDITAR: Hibernate no permite hacerlo; puede colocar la propiedad fuera de la clave y ajustar un poco la DAO para tener en cuenta el campo cuando sea necesario


Esto no es aconsejable. ¿Podrías usar una vista y un mapa en su lugar? Puede usar COALESCE para proporcionar un valor predeterminado si está atascado con datos heredados. Tuvimos muchos problemas con las claves compuestas e imagino que los valores nulos causarán aún más problemas.


No. Las claves primarias no pueden ser nulas.


Para las claves compuestas (se supone que la base de datos permite valores nulos en PK) puede tener un número máximo de números_cols ^ 2 - 1 entradas que contienen nulos (por ejemplo, para la clave compuesta de 2 columnas puede tener 3 filas que tienen en su clave primaria nula, la cuarta es la PK sin nulos).


No obtendrá un error, pero Hibernate no podrá asignar esas filas con valor NULL para la columna compuesta a su Entidad. Eso significa que obtienes entidad con valores NULL en el resultado.


Desafortunadamente, no. O tuve que usar una solución alternativa:

Utilicé Composit Id para una vista (! No table) donde las filas se pueden identificar exactamente por 2 cols (A, B). Aunque uno de los cols (B) puede tener valores nulos y enteros positivos. Así que mi solución es que creé un nuevo col en la vista: "BKey" y mi vista se escribe como si B fuera nulo, entonces el valor de BKey es -1 más BKey = B. (Solo números enteros positivos aparecen en B y nulo). También cambié mi implementación de identificador de compilación para usar BKey en lugar de B. Espero que ayude a alguien ...