Estoy tratando de recorrer todas mis tablas para poder truncar cada una (al comienzo de cada una de mis pruebas de JBehave).
Pensé que sería capaz de:
List allTables = session.createSQLQuery("SHOW TABLES").list();
Pero hibernate lanza una excepción SQLGrammarException, quejándose de que “la columna ‘TABLE_NAME’ no se encuentra”.
Supongo que esto se debe a que la consulta “mostrar tablas” en realidad no devuelve una lista de cadenas. ¿Hay otra forma de obtener una lista de todas mis tablas utilizando Hibernate?
Intenta algo como esto:
SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE();
Para las columnas (la misma situación con Hibernate) intente:
SELECT column_name FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=YOUR_TABLE_NAME
Si desea truncar toda la tabla, puede establecer hibernate.hbm2ddl.auto
en hibernate.cfg.xml por el valor Crear.
create
pero si solo desea obtener el nombre de todas las tablas y truncar algunos de ellos, este método no funcionará.
Si aún tiene acceso al objeto de Configuración de Hibernación, puede hacer esto:
for (Iterator iter=configuration.getClassMappings(); iter.hasNext();) { PersistentClass persistentClass = (PersistentClass)iter.next(); String table = persistentClass.getTable().getName(); // Code to truncate table (or just use a query with session.executeUpdate) }
Eso supone que tiene una tabla por entidad y solo le importan las tablas que están asignadas. De lo contrario, probablemente deba hacer algo con la conexión subyacente y el DatabaseMetaData, por ejemplo:
session.connection().getMetaData().getTables(catalog, schemaPattern, tableNamePattern, types)