Вы могли бы хотеть изучить Sgen.exe
инструмент, который идет с.NET. Существует также удобная небольшая вещь на странице "Build" свойств проекта Visual Studio C#, в самой нижней части, названной "Блок сериализации сборки", который автоматически работает Sgen
за Вами.
Я полагаю, что ужасный способ сделать это - удалить все.
public int hqlTruncate(String myTable){
String hql = String.format("delete from %s",myTable);
Query query = session.createQuery(hql);
return query.executeUpdate();
}
Вместо этого вы можете использовать session.createSQLQuery ()
:
session.createSQLQuery("truncate table MyTable").executeUpdate();
Излишне говорить, что это не идеально с точки зрения переносимости. Вероятно, неплохо было бы определить этот запрос в сопоставлении и получить его в коде как именованный запрос.
Я использовал синтаксис delete в HQL, чтобы сохранить переносимость. Работает отлично:
public abstract class GenericDAOImpl<T, ID extends Serializable> implements GenericDAO<T, ID> {
private Class<T> persistentClass;
// Balance of dao methods snipped... :)
/**
* Clears all records from the targetted file.
* @throws DAOException
*/
public int truncate() throws DAOException {
Session s = getSession();
int rowsAffected = 0;
try {
Class c = getPersistentClass();
String hql = "delete from " + c.getSimpleName();
Query q = s.createQuery( hql );
rowsAffected = q.executeUpdate();
} catch ( HibernateException e ) {
throw new DAOException( "Unable to truncate the targetted file.", e );
}
return rowsAffected;
}
/**
* Returns a Class object that matches target Entity.
*
* @return Class object from constructor
*/
public Class<T> getPersistentClass() {
return persistentClass;
}
Работает отлично и полностью усекает целевую таблицу. Используйте с осторожностью, так как ваш сервер db будет выполнять этот оператор с большой эффективностью... :)
Будьте осторожны, truncate и delete - это совершенно разные sql-запросы:
Если сложить все это вместе:
поэтому будьте осторожны с тем, какой оператор вы действительно хотите использовать.
Что касается усечения таблицы с помощью hql, то следует запретить выполнение DDL (truncate, create table, drop table, etc...) из приложения. Вы должны использовать delete. Но если таблица большая, это тоже не сработает. Вот почему опустошение таблицы в приложении в целом является плохой идеей. Если вы хотите произвести некоторую очистку, часто лучше запускать truncate внутри sql-скрипта раз в ночь.
Заметьте, что я не знаю специфики вашего приложения и говорю только в общем.