Можно ли повторно использовать прокси после ошибки поднятия базы данных в GWT RF?
Я нашел много неработающих ссылок, которые говорят: "Вы не можете повторно использовать EntityProxy после проверки ограничений в базе данных".
Существуют некоторые ограничения, которые я не могу проверить на стороне клиента, поэтому я хотел бы, чтобы они были извлечены из базы данных, а затем повторно использовали мой EntityProxy для исправления ошибок.
Например, у меня есть сущность, давайте назовем ее ServiceEntity
который имеет в базе данных простой индекс, как это (lower(name)
).
В точке saving/updating a Service
если database raises that index constraint violation
, Я бы хотел reuse my proxy
а также reedit it
(исправить неправильные поля и сохранить его снова)
Даже если исключение обнаружило, что это "ConstrainValidatonException", сбойный запрос передается методу onFailure(), а не методу onConstraint.
Я попробовал одно предложенное решение (глубокое клонирование, прокси-сервер сущности), и оно действительно работает. Но это действительно работает только для сохранения / сохранения действия. Для действия слияния, клонирование бесполезно. Старые объекты, которые уже находятся в базе данных, воспринимаются гибернацией как новые объекты, и она пытается сохранить их в базе данных (и индекс или другие ограничения поднимаются)
Обновления: так что, похоже, я еще не ясно дал понять.
У меня в базе данных на столе называется SERVICE
"следующий индекс на" NAME
колонка (lower(name))
, Так что в таблице "СЕРВИС" не может быть 2 записи, которые имеют одинаковое нижнее (имя).
Скажем " SERVICE
"таблица содержит запись с именем" JOB
".
В GWT я пытаюсь сохранить новый ServiceProxy в эту таблицу, и я даю его имя " jOB
Msgstr "Это вызовет ошибку в базе данных, ошибку нарушения ограничений. Я не могу проверить это перед отправкой запроса на сервер, поэтому база данных должна вернуть ошибку, и я должен заново отредактировать прокси-сервер и исправить его имя (быть действительным).
Стек будет выглядеть следующим образом:
[INFO] 2014-01-29 13:12:18,562 [qtp25907110-42] ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - ORA-00001: unique constraint (SERVICE_INDEX1) violated
[INFO]
[INFO] 2014-01-29 13:12:18,566 [qtp25907110-42] ERROR xxx.CustomRequestFactoryServlet$LoquaciousExceptionHandler - Server error
[INFO] org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [SERVICE_INDEX1]; nested exception is org.hibernate.exception.ConstraintVi
olationException: could not execute statement
[INFO] at org.springframework.orm.hibernate4.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:138)
[INFO] at org.springframework.orm.hibernate4.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:680)
[INFO] at org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:562)
[INFO] at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:755)
[INFO] at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:724)
[INFO] at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:475)
[INFO] at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:270)
[INFO] at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
[INFO] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
[INFO] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631)
Я отображаю клиентское сообщение об ошибке, подобное этому: "Сервис с указанным именем уже существует. Пожалуйста, выберите другое имя", а затем я хотел бы повторно отредактировать прокси-сервер, изменить имя и снова запустить прокси-сервер. сервер.
Это шаги