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
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:
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:
Ya tenemos de una forma muy sencilla solucionado nuestro problema de secuencias.
jose