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 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.

Comparte este artículo con quien quieras
Enlaces simbólicos en Java
Internacionalización en ES6 1: La clase Collator

Leave a Comment

Your email address will not be published. Required fields are marked *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.