ver valor utilizar una secuencias secuencia saber ejemplos ejemplo currval crear como actual oracle hibernate sequence

valor - utilizar sequence oracle



¿Cómo utilizar la secuencia de Oracle existente para generar ID en hibernación? (9)

Aquí hay un ejemplo de trabajo con anotaciones, de esta manera, se utilizará la secuencia de base de datos existente (también puede usar la estrategia de "secuencia", pero con menos rendimiento en la inserción):

@Entity @Table(name = "USER") public class User { // (...) @GenericGenerator(name = "generator", strategy = "sequence-identity", parameters = @Parameter(name = "sequence", value = "USER_SEQ")) @Id @GeneratedValue(generator = "generator") @Column(name = "ID", unique = true, nullable = false, precision = 22, scale = 0) public Long getId() { return this.id; }

Tengo una base de datos de Oracle heredada con una secuencia denominada PRODUCT_ID_SEQ .

Aquí está el mapeo de la clase de Product para el que necesito generar las identificaciones correctas:

public class Product { @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "retailerRaw_seq") @SequenceGenerator(name = "retailerRaw_seq", sequenceName = "PRODUCT_ID_SEQ") private Long id; ... }

Pero parece que las identificaciones se generan con un intervalo de 50, como 1000, 1050, 1100, etc. Esto corresponde al valor predeterminado de la propiedad de allocationSize de allocationSize = 50. Eso significa que Hibernate no usa realmente la secuencia que ya está definida en db

¿Cómo hago que Hibernate use la secuencia?


Cree su nombre de secuencia en Oracle, por ejemplo, contacts_seq. En tu clase de POJO. Defina la siguiente anotación para su secuencia.

@Id @GeneratedValue(strategy=GenerationType.AUTO, generator="my_seq_gen") @SequenceGenerator(name="my_seq_gen", sequenceName="contacts_seq")


La respuesta a la pregunta original:

@SequenceGenerator(name="EL_SEQ", sequenceName="EL_SEQ",allocationSize=1)

Es el allocationSize la allocationSize que establece el valor para incrementar en.


No estoy acostumbrado a usar anotaciones, esto es lo que tengo en mi * .hbm.xml:

<id name="id" type="java.lang.Integer"> <column name="ID_PRODUCT" /> <generator class="sequence-identity" > <param name="sequence">PRODUCT_ID_SEQ</param> </generator> </id>

Puede asignar fácilmente esto a las anotaciones. El generador de identidad de secuencia utiliza auto incremento con secuencias.


Si usa javax.persistence.SequenceGenerator, hibernate use hilo y posiblemente cree grandes huecos en la secuencia. Hay una publicación que aborda este problema: https://forum.hibernate.org/viewtopic.php?t=973682

Hay dos formas de solucionar este problema.

  1. En la anotación SequenceGenerator, agregue la asignaciónSize = 1, initialValue = 1

  2. En lugar de usar javax.persistence.SequenceGenerator, use org.hibernate.annotations, como esto:

    @ javax.persistence.SequenceGenerator (name = "Question_id_sequence", sequenceName = "S_QUESTION")

    @ org.hibernate.annotations.GenericGenerator (nombre = "Question_id_sequence", estrategia = "secuencia", parámetros = {@Parameter (nombre = "secuencia", valor = "S_QUESTION")})

He probado ambas formas, lo que funciona bien.


Tuve el mismo problema al actualizar de 3.5.5 a 5.0.6.Final.

Lo resolví reconfigurando el mapeo en el archivo HBM desde:

<generator class="sequence"> <param name="sequence">PRODUCT_ID_SEQ</param> </generator>

a:

<generator class="org.hibernate.id.enhanced.SequenceStyleGenerator"> <param name="prefer_sequence_per_entity">true</param> <param name="optimizer">none</param> <param name="increment_size">1</param> <param name="sequence_name">PRODUCT_ID_SEQ</param> </generator>


Uso el seguimiento en PostgreSQL y funciona bien.

@Id @GeneratedValue(generator = "my_gen") @SequenceGenerator(name = "my_gen", sequenceName = "my_seq_in_db") private int userId;


El tamaño de la asignación y el incremento son cosas completamente diferentes.

Hibernate, por supuesto, utiliza su secuencia creada en la base de datos, pero dependiendo del tamaño de la asignación puede encontrar una brecha en el valor generado.

Por ejemplo: Supongamos que el valor de secuencia actual es 5, que se incremente en 1 en db y que el tamaño de la asignación sea el 50 predeterminado.

Ahora desea guardar una colección de 3 elementos a través de hibernación, luego Hibernar asignará los ID generados 250, 251, 252

Esto es para fines de optimización. Hibernate no tiene que volver a la base de datos y buscar el siguiente valor incrementado.

Si no desea esto, solo tiene que allocationSize = 1 tamaño de allocationSize = 1 como ya contestado.



Por defecto, Hibernate usa el generador de secuencia HiLo que, a menos que tenga necesidades especiales, es bueno (en cuanto al rendimiento). Puedes leer más de eso en mi blog here

Eyal