Изменить 5/11/2011:
Я думаю, что это немного хуже, чем то, что ниже; в моем развернутом экземпляре QA, если я просто несколько раз обновляю основную информационную панель, в конечном счете, ассоциации многих пользователей со многими удаляются. На данный момент есть только операторы select, вызываемые на стороне сервера; надеюсь, я сужу это с этими последними тестами.
Оригинал:
Привет всем. У меня проблема с довольно сложным объектом; проблема заключается в следующем: когда я отправляю объект с клиента на сервер для сохранения, он, по-видимому, случайным образом стирает отношения «многие ко многим» для связанных объектов. Хуже того, я сам не могу воспроизвести проблему после примерно двух месяцев осознания проблемы. У меня есть приложение для тестирования с группой QA; они используют программу ежедневно, дважды входя в новые и устаревшие приложения. Проблема возникает три раза в день.
Я сделаю все возможное, чтобы предоставить как можно больше деталей, и буду очень признателен всем, кто смотрит!
Основой приложения является GWT 2.1 + Gilead + Hibernate 3 + MySQL InnoDB. Я позволяю Hibernate обрабатывать любые каскады и т. Д., Поэтому ни один из них не определен в БД, хотя все внешние ключи установлены в БД.
Вот некоторые выдержки из сопоставлений:
<hibernate-mapping>
<class name="com.example.domain.Close" table="CLOSE">
<many-to-one name="updateUser"
class="com.example.domain.User"
column="LAST_UPDATE_USER"/>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.example.domain.User" table="USER" batch-size="25">
<set name="groups" table="USER_GROUP" lazy="true" batch-size="25">
<key column="USER_ID"/>
<many-to-many column="GROUP_ID" class="com.example.domain.Group"/>
</set>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.example.domain.Group"
table="GROUP" batch-size="25">
<set name="users" table="USER_GROUP" lazy="true" inverse="true">
<key column="GROUP_ID"/>
<many-to-many column="USER_ID" class="com.example.domain.User"/>
</set>
<set name="permissions" table="PERMISSION_GROUP" lazy="true" inverse="true">
<key column="GROUP_ID"/>
<many-to-many column="PERMISSION_ID"
class="com.example.domain.Permission"/>
</set>
<hibernate-mapping>
<class name="com.example.domain.Permission"
table="PERMISSION">
<set name="groups" table="PERMISSION_GROUP" lazy="true">
<key column="PERMISSION_ID"/>
<many-to-many column="GROUP_ID"
class="com.example.domain.Group"/>
</set>
</class>
</hibernate-mapping>
Сохранение объекта - это просто вызов saveOrUpdate ():
Session session = gileadHibernateUtil.getSessionFactory()
.getCurrentSession();
session.beginTransaction();
try {
session.saveOrUpdate(close);
} catch (Exception e) {
e.printStackTrace();
session.getTransaction.rollback();
}
session.getTransaction.commit();
return close;
Close 'updateUser' - это объект, загружаемый при входе пользователя в систему. Он загружен соответствующими группами и разрешениями, поэтому система может предоставлять / запрещать доступ к модулям приложения. Я делаю
close.setUpdateUser(exampleApp.getUser());
перед отправкой объекта обратно на сервер.
В приложении есть множество других мест, где происходит такая операция, но она не вызывает нежелательных побочных эффектов. Вероятно, это сводится к сложности клиентского кода, связанного с объектом Close, или, скорее, к его реализации.
Я потратил так много времени на изучение официальных документов Hibernate, поиск возможных проблем и т. Д., Я подумал, что, возможно, пришло время обратиться за помощью. Я должен разобраться и продолжать, но, возможно, просто вопрос поможет мне разобраться.
Я не уверен, что еще предоставить сейчас, это актуально. Надеюсь, то, что здесь до сих пор имеет отношение!
Спасибо за внимание!
Редактировать
May 5 12:18:38 localhost jsvc.exec[10117]: Hibernate: insert into example_dev.RECENT_ITEM (OBJECT_TYPE, OBJECT_ID, DATE, USER_ID) values (?, ?, ?, ?)
May 5 12:18:38 localhost jsvc.exec[10117]: Hibernate: delete from example_dev.PERMISSION_GROUP where PERMISSION_ID=?
May 5 12:18:38 localhost last message repeated 19 times
May 5 12:18:38 localhost jsvc.exec[10117]: Hibernate: delete from example_dev.USER_GROUP where USER_ID=?
May 5 12:18:38 localhost jsvc.exec[10117]: Hibernate: delete from example_dev.USER_DESIGNATION where USER_ID=?
Похоже, что удаление происходит сразу после этой вставки. Все предыдущие операции - выбор. Но ничто в User не должно каскадироваться из RecentItem.