Удаление отношений на связанных объектах в приложении Hibernate + Gilead - PullRequest
0 голосов
/ 29 апреля 2011

Изменить 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.

1 Ответ

1 голос
/ 10 июня 2011

После долгих исследований я пришел к некоторым выводам и смог принять меры.Во-первых, после долгих поисков на форуме Gilead я узнал, что он больше не поддерживается активно поддерживается .Должен был заметить, что раньше.Тем временем я начал читать о RequestFactory и после нескольких дней исследований решил, что мне следует попробовать перейти на него.

Это довольно большой проект, примерно 50 доменных объектов, некоторые со многими ассоциациями объектов.У меня ушло около 40-50 часов, чтобы переписать все - от использования Gilead + GWT RPC до использования исключительно RequestFactory.Я очень доволен полученными изменениями в коде и структуре.До сих пор я не слишком беспокоился о необходимости создания прокси-объектов DTO, и я воспользовался возможностью переключиться на аннотации Hibernate, избавившись от файлов сопоставления.

Иногда было непросто рефакторинг кода виспользовать циклы выборки / редактирования / сохранения, требуемые RequestFactory.Это дало мне возможность улучшить код.

Хорошая новость в том, что проблема была решена.Больше никаких загадочных ассоциаций «многие ко многим».Мое лучшее предположение, что я сталкивался с ошибкой в ​​Gilead, или ее использование было некорректным, или возможно, что я решил проблему при переходе к аннотациям.

Я столкнулся с некоторыми большими ресурсами, изучая RequestFactory + Hibernateмногие через StackOverflow (еще раз спасибо!):

Использование GWT RequestFactory с Objectify - было здорово почувствовать, как RequestFactory взаимодействует с бэкендом, а также некоторые методы и шаблон для сокращенияв коде.

Надеюсь, еще больше ссылок внизу .. Я все еще новичок, поэтому я ограничен в количестве гиперссылок, которые я могу публиковать:)

Я многому научился и бегло говорюRequestFactory.Я сделаю все возможное, чтобы следить и помогать здесь, где я думаю, что могу.

Спасибо StackOverflow!

...