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.