Problemas de secuencias PostgreSQL con Hibernate

Por desgracia, en versiones antiguas de Hibernate no suelen funcionar los valores secuenciales de forma correcta con PostgreSQL. Pero tenemos una solución, y es que podemos obtener el identificador de forma manual. Para ello se creará el método siguiente:

/**
 * Obtiene el siguiente valor de una secuencia numérica.
 * @param  secuencia  Nombre de la secuencia.
 * @return Valor siguiente o 0 en caso de error.
 */
@SuppressWarnings("unchecked")
protected int getNext(final String secuencia) {
  int valor = 0;

  final StringBuilder sql = new StringBuilder();
  sql.append("SELECT nextval('");
  sql.append(secuencia);
  sql.append("')");

  final HibernateEntityManager hem = getJpaTemplate().getEntityManagerFactory().
            createEntityManager().unwrap(HibernateEntityManager.class);

  final List<BigInteger> ids = hem.getSession().createSQLQuery(sql.toString()).list();

  if (null != ids && !ids.isEmpty()) {
    valor = ids.get(0).intValue();
  }

  return valor;
}

El método anterior lo que hace es recibir el nombre de una secuencia, obtener el número siguiente e incrementarla. De esta forma el valor obtenido será el auto numérico que vamos a utilizar.

Ahora que tenemos nuestro nuevo número de secuencia, lo podremos utilizar de la forma siguiente:

/** Nombre de la secuencia a utilizar. */
private static final String SECUENCIA = "esquema.nuestra_id_seq";

/**
 * Inserta un nuevo valor de dominio en base de datos.
 * @param  dominio  Clase de dominio a utilizar.
 */
@Override
public void insertNext(final Dominio dominio) {
  dominio.setId(getNext(SECUENCIA));
  insert(dominio);
}

Ya tenemos de una forma muy sencilla solucionado nuestro problema de secuencias.

También te podría gustar...

Deja un comentario

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

El tiempo límite ha expirado. Por favor, recarga el CAPTCHA.