У меня есть простое объектное отношение, я хочу сохранить его в спящем режиме.
По сути, это родитель, который содержит коллекцию детей. Все, что я хочу сделать, это загрузить родителя, если он существует, в противном случае создайте его, добавьте к нему элементы и сохраните его.
Это делается в среде GWT, поэтому я передаю ChildDTO этому методу, который в основном является непостоянной версией класса Child (несовместимой с сериализацией RPC gwts).
public Integer testHibernate(Integer parentId, ChildDTO[] test) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Parent model;
if(parentId == null) {
// if the parentId is null, create new instance
model = new Parent );
}
else {
model = (Parent) hib.load(Parent.class, dto.getId());
}
model.setName("dummy name");
for(int i = 0; i < test.length) {
model.addChild(new Child(test[i].getId(), test[i].getName()));
}
hib.save(model);
hib.getTransaction().commit();
return model.getId();
}
Правильно, это прекрасно работает для создания новых родителей, без детей. Это также работает нормально, если я просто добавляю одного ребенка к существующему родителю. Однако, если я добавляю более одного дочернего элемента, я получаю сообщение об ошибке «невозможно вставить» из спящего режима.
Кроме того, если я попытаюсь добавить только одного дочернего элемента, к уже существующему родительскому элементу, к которому уже добавлен один дочерний элемент. Я получаю сообщение об ошибке «другой объект с таким же значением идентификатора уже связан с сеансом».
Дополнительный вопрос. При вставке только одного дочернего элемента в пустой родительский hibernate выполняет следующие действия:
Hibernate: insert into Child(ChildId, ChildName) values (default, ?)
Hibernate: update Parent set ChildId=? where ChildId=?
Что с обновлением? : S