2010-11-26 15 views
5

Me gustaría truncar todas las tablas de mi base de datos entre una prueba de integración a otra. ¿Cuál es la mejor manera de hacer esto usando hibernate?¿La mejor manera de truncar todas las tablas con hibernación?

Actualmente estoy haciendo esto:

public void cleanDatabase() { 
     doWithSession(new Action1<Session>() { 
      @Override 
      public void doSomething(Session session) { 
       SQLQuery query = session.createSQLQuery("truncate table stuff"); 
       // todo - generify this to all tables 
       query.executeUpdate(); 
      } 
     }); 

(doWithSession es un pequeño envoltorio que crea y cierra una sesión). Podría repetir todos mis objetos mapeados usando la reflexión ... Me pregunto si alguien ya resolvió este problema.

Respuesta

3

Supongo que probablemente no uses Spring. Si lo hizo, Spring's transactional test support sería ideal.

En resumen: Spring inicia automáticamente una transacción antes de cada caso de prueba y automáticamente lo vuelve a enrollar después del caso de prueba, dejándote con una base de datos vacía (o al menos sin cambios).

Tal vez usted podría imitar ese mecanismo:

Abrir una transacción en un método @Before, rodar de nuevo en un método @After.

+0

Pero ... pero quiero afirmar cosas en la base de datos. Para esto, necesito comprometerle cosas. – ripper234

+3

@ ripper234 Puede afirmar cosas perfectamente bien, siempre y cuando lo haga en el alcance de la transacción – Qwerky

+0

@Qwerky - hmm, suena como un enfoque interesante en ese momento. Lo probaré, gracias. – ripper234

0

Probablemente pueda soltar y volver a crear el esquema de Hibernate usando SchemaExport, aunque eso parece bastante duro. Revertir una transacción suena como una mejor idea.

0

Puede utilizar una base de datos memmory y soltar la base de datos completa entre sus pruebas.

Puedes usarlo de esta forma si no tienes muchas pero largas pruebas.

Pero tenga en cuenta que cada base de datos se comporta de un modo diferente al resto. Por lo tanto, usar una base de datos en memoria (por ejemplo, HyperSQL) no se comportará exactamente como su base de datos normal en algunos casos, por lo que no es una prueba de integración correcta.

Cuestiones relacionadas