Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Hibernate: "could not initialize a collection"


Автор: ochnev 8.2.2008, 02:28
Подскажите кто-нибудь, почему такое происходит?

Неожиданно стало всё время вылетать:
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 записей нет.

Автор: Samotnik 8.2.2008, 03:05
а что такое   group  ??
Я думаю, что проблема, в условии
Код

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

не проходит неравенство на ноль!

Автор: ochnev 8.2.2008, 03:53
Цитата(Samotnik @ 8.2.2008,  03:05)
а что такое   group  ??

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

Автор: tux 8.2.2008, 06:59
Приведи код Hibernate.initialize() и маппинг для WorkingDay. И стектрейс не помешал бы.

Автор: ochnev 8.2.2008, 12:42
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)


Автор: ochnev 8.2.2008, 14:36
В догонку:

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

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

Автор: mindflyer 8.2.2008, 16:35
Разве это полный стектрейс? И никаких "Caused by" больше нет? Обычно самый крайний бывает вполне информативен.
Скорее всего имеет место рассогласование маппинга и структуры бд. Проверь, точно ли структура таблицы соответствует маппингу.

Автор: ochnev 8.2.2008, 17:02
Проверил - так и есть. Колонка таблицы потерялась при изменениях в базе.
Сейчас исправил - заработало.

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

Благодарю.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)