Etiqueta: hibernate

Tips: Hibernate y los prefijos de tablas

14 jun 2007

Un problema muy común al que nos llevamos tiempo enfrentando es el uso de prefijos de tablas en los entornos de producción. Si por ejemplo nos asignan el prefijo “SB_”, la tabla que durante el desarrollo se llamaba “PERSONA” ahora pasa a llamarse SB_PERONA.

Al utilizar JPA/EJB3.0 este problema queda mitigado al utilizar la anotación @TABLE, pero nos sigue obligando a modificar todas las entidades de la aplicación para adaptarlas al nuevo prefijo.

Para solucionar esto, la especificación JPA contempla la posibilidad de establecer estrategias para la generación del nombre definitivo. Utilizando la implementación de Hibernate-entitymanager es tan sencillo como implementar nuestra propia clase NameStrategy e indicarla en persistece.xml.

1.- Indicamos a Hibernate la implementación que deseamos utilizar:

<--Configuración para el soporte de prefijos en Hibernate. Estrategia para generación de nombres de tablas asociadas a anotaciones Table JPA3.0.-->
<property name="hibernate.ejb.naming_strategy" value="com.viavansi.framework.persistencia.jpa.NamingStrategy"></property>

2.-Implementación, lo mas sencillo es sobreescribir el método String tableName(String tableName) de DefaultComponentSafeNamingStrategy que implementa la gestión de anotaciones JPA en Hibernate.

It’s a replace of prefix tables on Hibernate

Usando Hibernate 3.0: Delete ValueObject Where …

22 feb 2007

No todas las implementaciones de persistencia JPA soportan usando EJBQL, el uso UPDATE y DELETE con clausula WHERE, pero Hibernate si es una de ellas. Si bien, recientemente nos llevamos una desagradable sorpresa al comprobar que Hibernate no soportaba la clausula LIMIT, no podemos si no congratularnos de que sinembargo si que dispongamos de esta otra funcionalidad implementada.
A continuacion va un pequeño ejemplo de uso de DELETE con WHERE en lugar de por Id:


String ejbql = "DELETE "+ fooPersistentVOClass.getSimpleName() + " WHERE "+where;
manager.getTransaction().begin();
deletedEntities= manager.createQuery(ejbql).executeUpdate();
manager.getTransaction().commit();

Ojo que executeUpdate() no devuelve necesariamente el numero de columnas borradas en la operacion, devuelve el numero de entidades eliminadas.

Mas informacion en:

http://www.hibernate.org/hib_docs/entitymanager/reference/en/html/batch.html

Cuando Hibernate ataca a Postgres…

07 feb 2007

Quizas este post te ayude si estas buscando una solucion para alguna de las siguientes cuestiones:

  • Pasarle comillas a la BBDD atraves de Hibernate
  • Usar palabras reservadas del gestor de BBDD como nombre de columna o tabla en JPA.
  • Tienes una org.postgresql.util.PSQLException
  • Tienes una excepcion: column notation applied to type name, which is not a composite type

Recientemente jugando con JPA contra Postgres nos hemos encontrado con un problema de los que le pueden volver loco a uno. La excepcion que teniamos era:



 org.postgresql.util.PSQLException: ERROR: .user_id column notation applied to type name, which is not a composite type

Es el tipo de mensaje de error que despista y te puede hacer dar vueltas durante horas (o dias) buscando el problema donde no es.
Nosotros estabamos convencidos de que habia algo erroneo en nuestras annotations de las columnas

@Column(name="user_id")

Pero lo que ya nos hacia tirarnos de los pelos era que nos pasaba lo mismo ya hiciesemos la query consultando user_id o email.



 org.postgresql.util.PSQLException: ERROR: .email column notation applied to type name, which is not a composite type

En general nos ocurria con cualesquiera columnas de nuestra tabla user.

Al final dimos con lo que estaba ocurriendo… el problema estaba en la annotation

@Table(name="user")

Os vais a reir… Resulta que user es una palabra reservada de Postgres, como tambien lo es id y algunas otras. Asi que si llamamos user a nuestra tabla, en la annotation necesitamos usar comillas para que el motor de BBDD no se haga un lio.

Y la forma de pasarle a Hibernate las comillas viene explicada aqui:
http://www.hibernate.org/hib_docs/reference/en/html/mapping.html#mapping-quotedidentifiers

O sea, que usando la tilde invertida -`- Hibernate nos la traduce a las comillas adecuadas del dialecto adecuado.

Basicamente, nuestro problema se arreglo haciendo:

@Table(name="`user`")