Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hibernate: "could not initialize a collection", SQLGrammarException 
:(
    Опции темы
ochnev
Дата 8.2.2008, 02:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 253
Регистрация: 27.3.2006

Репутация: нет
Всего: нет



Подскажите кто-нибудь, почему такое происходит?

Неожиданно стало всё время вылетать:
org.hibernate.exception.SQLGrammarException: could not initialize a collection

Вылетает на вызове Hibernate.initialize(myObject.getColletcionOfSomething())
Почему "неожиданно" - потому что раньше там не вылетало, и в похожих вызовах тоже всё работало и работает.

Подробности:

Фрагмент кода, на котором вылетает ошибка:
Код

                Hibernate.initialize(group.getInstructors());    // тут работает нормально

                if(group.getWorkingDays() != null) {
                    Hibernate.initialize(group.getWorkingDays());    // тут падает
                }


Мэппинг:
Код

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="ru.sixthsense.data.Group" table="grp">
        <id name="id" column="id">
            <generator class="native"/>
        </id>

        <property name="title"/>
        <!-- ... и другие свойства ... -->

        <set name="instructors" table="grp_instructor">
            <key column="group_id"/>
            <many-to-many class="ru.sixthsense.data.User" column="instructor_id"/>
        </set>
        <set name="workingDays">
            <key column="group_id"/>
            <one-to-many class="ru.sixthsense.data.WorkingDay"/>
        </set>
    </class>
</hibernate-mapping>


Таблицы:
Код

CREATE TABLE grp (
    id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(60) NOT NULL
    -- ... и другие столбцы
) CHARACTER SET utf8;

CREATE TABLE working_day (
    id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
    date_time DATETIME NOT NULL,
    group_id INTEGER NOT NULL REFERENCES grp
) CHARACTER SET utf8;


В таблице working_day записей нет.

PM MAIL   Вверх
Samotnik
Дата 8.2.2008, 03:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 5
Всего: 191



а что такое   group  ??
Я думаю, что проблема, в условии
Код

  if(group.getWorkingDays() != null) {
                    Hibernate.initialize(group.getWorkingDays());    // тут падает
                }

не проходит неравенство на ноль!
PM MAIL   Вверх
ochnev
Дата 8.2.2008, 03:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 253
Регистрация: 27.3.2006

Репутация: нет
Всего: нет



Цитата(Samotnik @ 8.2.2008,  03:05)
а что такое   group  ??

Всего лишь имя переменной. Это обычный bean, связанный с записью в базе.
А от сравнения с null ничего падать не может.

PM MAIL   Вверх
tux
Дата 8.2.2008, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Приведи код Hibernate.initialize() и маппинг для WorkingDay. И стектрейс не помешал бы.
PM MAIL Skype GTalk Jabber YIM   Вверх
ochnev
Дата 8.2.2008, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 253
Регистрация: 27.3.2006

Репутация: нет
Всего: нет



Hibernate.initialize() - это исходник самого Hibernate, это не из моего проекта.
Вот он (раз уж спросил):
Код

    public static void initialize(Object proxy) throws HibernateException {
        if ( proxy == null ) {
            return;
        }
        else if ( proxy instanceof HibernateProxy ) {
            ( ( HibernateProxy ) proxy ).getHibernateLazyInitializer().initialize();
        }
        else if ( proxy instanceof PersistentCollection ) {
            ( ( PersistentCollection ) proxy ).forceInitialization();
        }
    }


Мэппинг для WorkingDay:

Код

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="ru.sixthsense.data.WorkingDay" table="working_day">
        <id name="id" column="id">
            <generator class="native"/>
        </id>

        <property name="dateTime" column="date_time" type="timestamp"/>
        <property name="weekDay" column="weekday"/>

        <many-to-one name="group" column="group_id" class="ru.sixthsense.data.Group" not-null="true"/>
        <set name="attendanceData" inverse="true">
            <key column="working_day_id"/>
            <one-to-many class="ru.sixthsense.data.Attendance"/>
        </set>
    </class>
</hibernate-mapping>


Stack trace:

Цитата

org.hibernate.exception.SQLGrammarException: could not initialize a collection: [ru.sixthsense.data.Group.workingDays#1]
    org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
    org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    org.hibernate.loader.Loader.loadCollection(Loader.java:2001)
    org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:36)
    org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:565)
    org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:60)
    org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1716)
    org.hibernate.collection.AbstractPersistentCollection.forceInitialization(AbstractPersistentCollection.java:454)
    org.hibernate.Hibernate.initialize(Hibernate.java:309)
    ru.sixthsense.servlet.GroupSetupServlet.doGet(GroupSetupServlet.java:56)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)


PM MAIL   Вверх
ochnev
Дата 8.2.2008, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 253
Регистрация: 27.3.2006

Репутация: нет
Всего: нет



В догонку:

Что-то там вообще беда.
Не только Hibernate.initialize() не срабатывает, но и просто запрос на выборку из WorkingDay не срабатывает.
Всё работало, теперь всё накрылось...

Почему у Hibernate такие немногословные описания ошибок? Уже который раз замечаю, что детали выяснить - вообще без шансов. Остаётся только догадываться, где мог ошибиться.


Это сообщение отредактировал(а) ochnev - 8.2.2008, 14:38
PM MAIL   Вверх
mindflyer
Дата 8.2.2008, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 20.10.2004
Где: Smolensk, Russia

Репутация: 3
Всего: 4



Разве это полный стектрейс? И никаких "Caused by" больше нет? Обычно самый крайний бывает вполне информативен.
Скорее всего имеет место рассогласование маппинга и структуры бд. Проверь, точно ли структура таблицы соответствует маппингу.
PM MAIL ICQ   Вверх
ochnev
Дата 8.2.2008, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 253
Регистрация: 27.3.2006

Репутация: нет
Всего: нет



Проверил - так и есть. Колонка таблицы потерялась при изменениях в базе.
Сейчас исправил - заработало.

Да, стектрейс был полным.

Благодарю.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0475 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.