El @GeneratedValue(strategy=GenerationType.TABLE)
le dice al proveedor de JPA que use una tabla para obtener ID al insertar entidades recién creadas en la base de datos.
Al usar Hibernate como proveedor, esto dará como resultado una tabla hibernate_sequences
que tiene dos columnas: el nombre de la entidad y la identidad máxima ya asignada a esta entidad. Aquí, parece que Hibernate no consigue obtener el siguiente ID de su entidad, pero es difícil decir exactamente por qué porque no proporcionó suficiente información para eso.
Entonces, ¿podría por favor proporcionar la stacktrace completa? Además, active el registro con la propiedad hibernate.show_sql
establecida en true
y configure el nivel de registro adecuado log4j.logger.org.hibernate.SQL=DEBUG
. Únase al registro de su pregunta si es posible.
Tal vez solo verifique que configuró el hibernate.dialect
correcto para Oracle. En realidad, únete a tu configuración de hibernación también si es posible.
PD: La forma "tradicional" de generar PK con Oracle es usar secuencias (puede dejar que Hibernate adivine la mejor estrategia para su tipo de base de datos usando GenerationType.AUTO
o forzarlo usando SEQUENCE
) pero supongo que quiere la resultante la estructura de datos debe ser independiente de la base de datos. Si no, sugeriría ir a las secuencias en su lugar.
EDIT: respondiendo un comentario de la OP sobre GenerationType.AUTO
. De hecho, el valor predeterminado es una secuencia global única llamada hibernate_sequence
y esto podría ser un problema. Sin embargo, con la configuración se muestra a continuación, puede utilizar GenerationType.AUTO
y todavía controlar el nombre de la secuencia para los casos en que la base de datos utiliza secuencias:
@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="my_entity_seq_gen")
@SequenceGenerator(name="my_entity_seq_gen", sequenceName="MY_ENTITY_SEQ")
private long id;
En otras palabras, se puede utilizar utilizar un nombre de secuencia diferente para cada mesa sin perder la portabilidad.
si pongo GenerationType.Auto, utilizará el número incremental global, significa que todas mis entidades incrementarán el mismo número. El código funciona bien, pero ¿se quedará sin número incremental? – cometta
@Pascal: Si proporcionamos un SequenceGenerator ¿ayuda a especificar la estrategia como AUTO? – Nrj
@Nrj En realidad, si usa 'AUTO' y si la base de datos usa secuencias,' @ SequenceGenerator' ayudará a controlar el nombre de la secuencia. Pero simplemente será "ignorado" si la base de datos no lo hace (por ejemplo, con HSQLDB). Entonces, a diferencia de 'SEQUENCE', esto sigue siendo portátil. –