Saltar al contenido

Generación automática de clave primaria JPA

Solución:

los @GeneratedValue(strategy=GenerationType.TABLE) le dice al proveedor de JPA que use una tabla para obtener los 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 logra obtener la siguiente ID para su entidad, pero es difícil decir exactamente por qué porque no proporcionó suficiente información para eso.

Entonces, ¿podría proporcionar el seguimiento de pila completo? Además, active el registro con hibernate.show_sql propiedad establecida en true y establezca el nivel de registro adecuado log4j.logger.org.hibernate.SQL=DEBUG. Súmate al registro a tu pregunta si es posible.

Tal vez solo verifique que configuró el hibernate.dialect para Oracle. De hecho, ú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 asumiré que desea que la estructura de datos resultante sea independiente de la base de datos. Si no es así, te sugiero que optes por secuencias.

EDITAR: Respondiendo a un comentario del OP sobre GenerationType.AUTO. De hecho, el valor predeterminado es una única secuencia global llamada hibernate_sequence y esto podría ser un problema. Pero, con la configuración que se muestra a continuación, puede usar GenerationType.AUTO y aún controlar el nombre de la secuencia para los casos en los que la base de datos usa 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, puede usar un nombre de secuencia diferente para cada tabla sin perder la portabilidad.

Hay 4 estrategias para la generación automática en JPA:

  • Auto
  • Identidad
  • Secuencia
  • Mesa

Para la anotación de clave primaria de generación automática de Oracle, Sequence y Table son sus opciones. La lógica básica es definir un generador primero, usar @SequenceGenerator o @TableGenerator respectivamente, luego use el generador como atributo en @GeneratedValue.

Esta es una muestra de cómo usar la estrategia de secuencia:

  @Id
  @SequenceGenerator(name="SEQ_GEN", sequenceName="SEQ_JUST_FOR_TEST", allocationSize=1)
  @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_GEN")
  private long id;

A continuación, se muestra un ejemplo de cómo utilizar la estrategia de tabla:

  @Id
  @TableGenerator(name="TABLE_GEN",table="T_GENERATOR", pkColumnName = "GEN_KEY", pkColumnValue = "MONITOR2012.T_JUST_FOR_TEST", valueColumnName = "GEN_VALUE", initialValue = 1, allocationSize = 1 )
  @GeneratedValue(strategy = GenerationType.TABLE, generator="TABLE_GEN")
  private long id;

Si no hay generador especificado en @GeneratedValue anotación, la elección se dejará en manos de la implementación de JPA.

Si está trabajando en una base de datos con tablas existentes, asegúrese de tener la secuencia o la tabla definida en la base de datos antes de ejecutar su aplicación. El generador de tablas también necesitará que inserte una línea en la tabla antes de que la anotación @GeneratedValue pueda funcionar correctamente.

Aquí hay un tutorial sobre cómo configurar la generación automática de claves primarias en JPA para la base de datos Oracle.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *