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)
Re: Hibernate коллекции
От: b_manvelyan Украина  
Дата: 18.12.06 06:49
Оценка:
Здравствуйте, C_Angel, Вы писали:

// пропущено
C_A>Все это богатство используется в Swing клиенте. Приведены только значащие поля.
Ну судя по ошибкам не все. Что такое Subject, и что такое logic.LoadItem._loadItemsBackref ?
Если я правильно догадался logic.LoadItem._loadItemsBackref это обратная ссылка на Teacher содержащий данный LoadItem, и hibernate подсказывает что он null.
То что ты хочешь добиться неплохо описано в туториале Hibernate, приблизительно в 22.2. Bidirectional one-to-many
Re[2]: Hibernate коллекции
От: C_Angel  
Дата: 18.12.06 08:27
Оценка:
Здравствуйте, b_manvelyan, Вы писали:

_>Здравствуйте, C_Angel, Вы писали:


_>// пропущено

C_A>>Все это богатство используется в Swing клиенте. Приведены только значащие поля.
_>Ну судя по ошибкам не все. Что такое Subject, и что такое logic.LoadItem._loadItemsBackref ?
Subject — это <many-to-one name = "subject"/> в LoadItem, думаю большой роли это не играет... просто зря конструктор не пустой написал....

_>Если я правильно догадался logic.LoadItem._loadItemsBackref это обратная ссылка на Teacher содержащий данный LoadItem, и hibernate подсказывает что он null.

Вот эта обратная ссылка меня сильно интересует. Вообще у меня должно быть не bidirectional по модели и LoadItem — не знает о своей принадлежности к Teacher. Видимо она сгенерилась сама.
_>То что ты хочешь добиться неплохо описано в туториале Hibernate, приблизительно в 22.2. Bidirectional one-to-many
Пробовал делать полностью из туториала — bidirectional. Не помогло.
Проблема в том, что первое добавление проходит, а второе — ни в какую.

Кстати попутно... перечитал все что было про свойство inverse. Так и не понял как его правильно использовать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.