Ошибки Grails 2.4 и hibernate4 с run-app
Я обновил приложение до Grails 2.4.0, и я использую плагин hibernate4. При выполнении run-app приведенные ниже примеры ошибок генерируются для каждого класса домена с использованием базы данных в памяти. Я читал несколько сообщений на форумах спящего режима, что ошибки не являются серьезными. Он просто регистрирует ошибку, потому что таблица, которую она пытается удалить, еще не существует.
2014-Mai-24 13: 25: 26,788 ОШИБКА [localhost-startStop-1] org.hibernate.tool.hbm2ddl.SchemaExport - SchemaExport.java 425 - HHH000389: Неудачный: изменить ограничение на ограничение пользователя user_role FK_apcc8lxk2xnug8377fatvbn04, если существует
2014-Mai-24 13: 25: 26,789 ОШИБКА [localhost-startStop-1] org.hibernate.tool.hbm2ddl.SchemaExport - SchemaExport.java 426 - таблица "USER_ROLE" не найдена; Оператор SQL: alter table user_role drop ограничение FK_apcc8lxk2xnug8377fatvbn04, если существует [42102-173]
Кто-нибудь знает, как остановить шум журналирования?
Ответы
Ответ 1
Это ошибка, кажется, что вы можете оставить ее таким образом и не вызовет никаких проблем, но если вы не хотите видеть сообщение, вот некоторые решения: (Изменить: вариант 2, похоже, работает лучше (см. комментарии в этом посте))
1.- Конфигурация singleSession из DataSource.groovy
https://jira.grails.org/browse/GRAILS-11198
2.- переопределение диалекта H2:
public class ImprovedH2Dialect extends H2Dialect {
@Override
public String getDropSequenceString(String sequenceName) {
// Adding the "if exists" clause to avoid warnings
return "drop sequence if exists " + sequenceName;
}
@Override
public boolean dropConstraints() {
// We don't need to drop constraints before dropping tables, that just
// leads to error messages about missing tables when we don't have a
// schema in the database
return false;
}
}
Неудачно: измените ограничение XXX ограничения кавычки YYY в автономном режиме Hibernate/JPA/HSQLDB
Ответ 2
Решение @Luis, приведенное выше, также работает для MYSQL. Просто добавьте MySQL5InnoDBDialect, как показано ниже:
import org.hibernate.dialect.MySQL5InnoDBDialect;
public class ImprovedMySQLDialect extends MySQL5InnoDBDialect {
@Override
public String getDropSequenceString(String sequenceName) {
// Adding the "if exists" clause to avoid warnings
return "drop sequence if exists " + sequenceName;
}
@Override
public boolean dropConstraints() {
// We don't need to drop constraints before dropping tables, that just leads to error
// messages about missing tables when we don't have a schema in the database
return false;
}
}
Затем в вашем файле источника данных измените следующую строку:
dialect = org.hibernate.dialect.MySQL5InnoDBDialect
к
dialect = my.package.name.ImprovedMySQLDialect
Ответ 3
Просто установите dbCreate="update"
, и ошибки немедленно исчезнут.
Проблема в том, что GORM (hibernate) пытается удалить таблицы в базе данных H2, которые никогда не создавались, потому что при каждом запуске приложения создается новый БД. К сожалению, dbCreate настроен на создание-drop по умолчанию, что действительно не имеет смысла для базы данных, которая создается "на лету" во время выполнения.
development {
dataSource {
dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', ''
url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"
}