la secuencia de hibernación y oráculo GenericGenerator crea una brecha

He mapeado mi clase de la siguiente manera (omití otros campos ya que solo importa la identificación):

@Entity
@Table(name = "MODEL_GROUP")
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
public class SettlementModelGroup implements Serializable
{


@Id
@GeneratedValue(generator = "MODEL_GROUP_SEQ", strategy = GenerationType.SEQUENCE)
@GenericGenerator(name = "MODEL_GROUP_SEQ",
        strategy = "sequence",
        parameters = @Parameter(name = "sequence", value = "SEQ_MODEL_GROUP_MODEL_GROUP_ID"))
@Column(name = "MODEL_GROUP_ID", nullable = false)
private Integer modelId;
}

cuando estoy guardando un nuevo objeto:

Integer modelGroupId = sessionFactory.getCurrentSession().save( modelGroup );
System.out.println( modelGroupId );

ID se establece como por ejemplo 23, pero cuando miro la base de datos en realidad es 24. Esto está generando muchos problemas, ya que usaré esta ID más adelante. ¿Alguna idea de por qué está haciendo esta brecha?

Los registros de SQL muestran que todo está bien (eso creo):

Hibernate: 
 select
     SEQ_MODEL_GROUP_MODEL_GROUP_ID.nextval 
 from
     dual
Hibernate: 
 insert 
 into
     MODEL_GROUP
     (DOMAIN_ID, DESCRIPTION, NAME, PERIOD_TYPE_ID, MODEL_GROUP_TYPE_ID, STATUS_ID, OWNER_ID, MODEL_GROUP_ID) 
 values
     (?, ?, ?, ?, ?, ?, ?, ?)

Disparador y secuencia:

CREATE SEQUENCE "SEQ_MODEL_GROUP_MODEL_GROUP_ID" 
  INCREMENT BY 1 
  START WITH 1 
  NOMAXVALUE 
  MINVALUE 1 
 NOCYCLE 
 NOCACHE 
 NOORDER
;

CREATE OR REPLACE TRIGGER "TRG_MODEL_GROUP_MODEL_GROUP_ID" 
BEFORE INSERT 
ON "MODEL_GROUP" 
FOR EACH ROW 
WHEN (NEW."MODEL_GROUP_ID" is NULL)
BEGIN 
    SELECT "SEQ_MODEL_GROUP_MODEL_GROUP_ID".NEXTVAL 
    INTO :NEW."MODEL_GROUP_ID" 
    FROM DUAL; 
END;

preguntado el 27 de julio de 12 a las 17:07

No sé nada de hibernate, pero si busca en Google "cómo hibernate maneja las secuencias de Oracle", creo que encontrará las respuestas a sus preguntas. -

¡Gracias, tu pista me ayudó a deshacerme de este error! -

1 Respuestas

Aparentemente, cuando Hibernate solicita a su base de datos el siguiente valor de ID, también activa Trigger. Entonces, cuando pido una identificación, tengo un número 23 pero cuando en realidad se guarda en la base de datos al confirmar la transacción, se incrementa nuevamente, así que tengo 24. La solución se describe aquí:

Problema de HIbernate con Oracle Trigger para generar id a partir de una secuencia

Para que funcione correctamente, cambié Trigger:

CREATE OR REPLACE TRIGGER "TRG_MODEL_GROUP_MODEL_GROUP_ID" 
BEFORE INSERT 
ON "MODEL_GROUP" 
FOR EACH ROW 
WHEN (NEW."MODEL_GROUP_ID" is NULL)
BEGIN 
    SELECT "SEQ_MODEL_GROUP_MODEL_GROUP_ID".NEXTVAL 
    INTO :NEW."MODEL_GROUP_ID" 
    FROM DUAL; 
END;

contestado el 23 de mayo de 17 a las 11:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.