Hibernate коллекции
От: C_Angel  
Дата: 17.12.06 20:40
Оценка:
Уже третьи сутки бьюсь над проблемой...
Есть две связанные сущности:
<hibernate-mapping default-cascade="all,delete-orphan" package = "logic">

    <class name = "Teacher">
        <id name = "teacherId">
            <generator class = "native"/>
        </id>
        <set name="loadItems">
            <key column="teacherId" not-null = "true"/>
            <one-to-many class="LoadItem"/>
        </set>
    </class>

   <class name = "LoadItem" table = "`Load`">
        <id name = "loadItemId">
            <generator class = "native"/>
        </id>
    </class>
</hibernate-mapping>

Все это богатство используется в Swing клиенте. Приведены только значащие поля.

Схема работы следующая:

В первой форме — грузится список Teacher'ов и открывается диалог редактирования одной из них. Там — список LoadItem'ов, переданный сюда в виде массива взятого у Teacher'a. Жмем кнопку добавить — открывается еще формочка, в которую передается объект Teacher. На основе данных этой формы создается новый экземпляр LoadItem и добавляется в коллекцию Teacher', затем этот объект (LoadItem) передается в форму которая отображает его содержимое и позволяет сохранить или отменить создание этого объекта.

Работа с Hibernate в каждой форме идет по вот такой схеме:
Session session = HibernateUtil.getSessionFactory().getCurrentSession(); // HibernateUtil - это статический хелпер который содержит экземпляр SessionFactory
session.beginTransaction();
Subject subject = (Subject) session.load(Subject.class, subjectId);
LoadItem li = new LoadItem(subject);


Сохранение объекта LoadItem выглядит так:

    private void saveLoadItem(LoadItem loadItem)
    {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        session.saveOrUpdate(loadItem);
        session.getTransaction().commit();
    }



Если добавляем один объект в коллекцию Teacher'а и сохраняем — все ок.
Если не сохранять объект Teacher — добавление второго элемента в коллекцию вызывает следующее исключение:

org.hibernate.PropertyValueException: not-null property references a null or transient value: logic.LoadItem._loadItemsBackref


Вот такие дела. Буду благодарен за любые полезные комментарии!

Вообще вопрос — правильно я организовал схему работы с сессиями, если у меня : current_session_context_class = thread?

(PS. кросспостом в ru_java)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.