2011-12-21 17 views
9

Realizo una aplicación de muestra con Hibernate. Mi requisito es que no haya una clave principal en la mesa. Solo tuve que seleccionar la consulta de la aplicación. Sé que debería haber una clave principal, pero la tabla a la que me refiero se ha hecho sin ella.Hibernar sin clave principal

Tiene aproximadamente 50k registros. Por lo tanto, modificar la tabla para agregar una columna de ID no muestra la opción viable.

¿Es posible?

Respuesta

22
  1. Hibernate requires that entity tables have primary keys. Fin de la historia.
  2. 50k registros simplemente no son tantos cuando se trata de una base de datos.

Mi consejo: agregue una columna entera de autoincrement PK a la tabla. Te sorprenderá lo rápido que es.

+3

La respuesta mencionada por awied aquí [Hibernate y no funciona PK] (http://stackoverflow.com/questions/767277/hibernate-and-no-pk) sin tocar la tabla de la base de datos en absoluto. Este es un ejemplo de Hibernate en realidad no comprueba la duplicación. – Sankalp

8

Por lo tanto, la modificación de la tabla para agregar la columna ID no muestra la opción viable.

¿Por qué? ¿Lo dices en serio, porque ya tiene cincuenta mil registros? Confía en mí, eso no es mucho.


Incluso si la tabla no tiene una clave sustituta, y no tiene una restricción de clave primaria, e incluso si usted no está dispuesto a modificar la tabla, todavía probablemente tiene algún tipo de candidate key — es decir, un conjunto de columnas que nunca son nulas y cuyos valores identifican de manera única un registro. Incluso sin alterar la tabla para imponer su singularidad y no nulidad, puede decirle a Hibernate que esas columnas forman un composite ID.

+3

Esta es una buena respuesta, pero para respaldar el OP, hay MUCHAS circunstancias en las que no se puede modificar la tabla y "corregir". Por ejemplo, el cliente nos da una vista que se creó que no contiene ID, clave principal y, en muchos casos, filas duplicadas. Muy frustrante, pero sucede. – cbmeeks

+1

Tema viejo, pero todavía lo encuentro en google.Vale la pena mencionar que cuando trabaje en un entorno empresarial, no podrá justificar agregar una columna adicional a una tabla con un gran rendimiento y millones de filas solo porque no puede consultarlo con el marco orm elegido ... usted simplemente tiene que trabajar alrededor de eso. – cowls

0

He encontrado solución para tablas sin clave principal y nulo como valores. Funcionará en Oracle DB. Tal vez algo similar existe para otras DB.

  1. Debe crear nueva clave primaria en la clase POJO:

    @Id @Column (name = "id") privada ID Integer;

y utilizar createNativeQuery como esto

getEntityManager().createNativeQuery("select rownum as id, ..... 

La consulta nativa generará la clave principal y obtendrá resultados únicos.

Cuestiones relacionadas