He configurado la hibernación usar oracle secuencia. La secuencia se crea con caché=20, incremento=1.

Todo funciona bien, hibernate persistencia de las entidades. El valor de id es extraño: 50,51….76,201,202…209,1008,1009,5129,5130 ….

Si pido la secuencia de valor (seleccione hibernate_sequence.nextval dual) me siento como valor 2,3,4 ….

Si enciendo hibernate sql de depuración, hay tiempo para el tiempo de la llamada «seleccione hibernate_sequence.nextval de doble», pero el número asignado por hibernate ID no relé de secuencia!

@Id
@Column(name = "ID", insertable = false, updatable = false)
@SequenceGenerator(name = "SequenceIdGenerator", sequenceName = "HIBERNATE_SEQUENCE")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SequenceIdGenerator")
private Long id;
InformationsquelleAutor Vlada | 2011-08-24

3 Comentarios

  1. 33

    Esto es debido a que el SequenceGenerator no es realmente un generador de secuencias. Es una secuencia hi-lo del generador. Esto significa que la primera vez que se invoca, se obtiene el siguiente valor de la secuencia (6 por ejemplo), luego se multiplica este valor por 50 y te da el resultado (300). La próxima vez que se invoca, se devuelve 301 (sin ir a la secuencia), y así sucesivamente hasta llegar a 349. A continuación, se pide a la secuencia para el siguiente valor y obtiene 7, que se multiplica por 50 de nuevo para darle 350. Mi algoritmo descripción de uno, pero usted consigue la idea.

    Si detener e iniciar su aplicación, por lo tanto, tienen lagunas. Pero es más eficiente que un puro generador de secuencias, ya que sólo hace una base de datos llamada de vez en 50 generaciones.

    Ver http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#mapping-declaration-id-enhanced-optimizers y http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#mapping-declaration-id-generator para más detalles.

    • Usted no tiene que incrementar en un 50 por cada vez. Eso es sólo el valor predeterminado. El uso de @SequenceGenerator(name=»SEQ_ID»,sequenceName=»SEQ_ID», allocationSize=1) incremento de sólo uno. allocationSize es la clave.
    • Existe de todos modos para no usar esto? Desde Que hace un gran problema para mí, después de haber otros factores desencadenantes usando esta misma secuencia para esta tabla. Entonces se podría encontrar este número en el futuro, ¿verdad?
    • Ver el comentario justo encima de la suya. Uso allocationSize.
    • Wow, gracias por esta respuesta. Suena como Hibernate, se ha reinventado a Oracle de la secuencia de la caché…
  2. 6

    Supongo que tu pregunta es que los valores de la columna ID de la base de datos no son una secuencia natural, pero ¿por qué usted está viendo las diferencias:

    Un poco de historia:

    • Cada vez que usted llame select HIBERNATE_SEQUENCE.nextval from DUAL el valor de la secuencia es mayor.
    • Como su nombre de la secuencia es genérico, en lugar de ser específicos a la mesa, si tienes múltiples entidades que todo el uso de la HIBERNATE_SEQUENCE como de identificación de generador, entonces los valores de las secuencias se utilizan en todas las entidades.
    • Si alguna otra aplicación utiliza HIBERNATE_SEQUENCE, entonces el valor se omite así.
    • Como se utiliza la CACHÉ de=20, Oracle va a agarrar de los números de secuencia en bloques de 20 y, a continuación, utilizar una caché interna de retorno de los números. Esto puede llevar a que los números se omite si se pierde la caché (por ejemplo, si la base de datos está apagado).
    • Si se eliminan las filas de la base de datos, la secuencia de valor no cambia

    Por ejemplo, considere el siguiente escenario:

    Tienes dos entidades Entity1 y Entity2 utilizando HIBERNATE_SEQUENCE como la IDENTIFICACIÓN de generador:

    1. Actual HIBERNATE_SEQUENCE valor es de 100
    2. Un Entity1 se inserta (usa HIBERNATE_SEQUENCE que devuelve 101)
    3. Un Entity2 se inserta (usa HIBERNATE_SEQUENCE que devuelve 102)
    4. Un Entity2 se inserta (usa HIBERNATE_SEQUENCE que devuelve 103)
    5. La Entity2 con ID 103 se elimina
    6. Que ejecutar manualmente select HIBERNATE_SEQUENCE.nextval from DUAL (devuelve 104)
    7. Un Entity1 se inserta (usa HIBERNATE_SEQUENCE que devuelve 105)
    8. Un Entity2 se inserta (usa HIBERNATE_SEQUENCE que devuelve 106)

    Así que al final tendrás:

    • Entity1 con IDs (101, 105)
    • Entity2 con IDs (102, 106)

    que explica las diferencias.

    EDICIÓN:

    Incluso si el @SequenceGenerator fueron de configuración para utilizar el SequenceGenerator en lugar de la SequenceHiLoGenerator (como se ha señalado por JB Nizet, que creo que es una mejor explicación de las lagunas), las brechas en los Identificadores generados por las secuencias son una ocurrencia común.

  3. 0
    CREATE SEQUENCE SEQ_SEQUENCENAME INCREMENT BY 1 START WITH 1 MINVALUE 1;
    grant all on SEQ_SEQUENCENAME to public;
    
    @Id
    @Column(name = "ID", unique = true, nullable = false)
    @SequenceGenerator(name = "SequenceIdGenerator", sequenceName = "SEQ_SEQUENCENAME")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SequenceIdGenerator")
    private int Id;
    • describa su respuesta en vez de copiar-pegar

Dejar respuesta

Please enter your comment!
Please enter your name here