Уже третьи сутки бьюсь над проблемой...
Есть две связанные сущности:
<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)