在GWT RF中,是否可以在数据库引发错误后重用代理?

时间:2014-01-28 17:38:40

标签: hibernate gwt oracle11g requestfactory

我发现很多死链接都说“在数据库中发生约束验证后,你无法重用EntityProxy”。

有一些限制我无法在客户端验证它们,所以我希望从数据库中检索它们,然后重用我的EntityProxy来纠正错误。

例如,我有一个实体,我们称之为 ServiceEntity ,它在数据库上有一个像这样的简单索引( lower(name)

saving/updating a Service 点,如果 database raises that index constraint violation ,我想 reuse my proxy reedit it (纠正错误的字段并再次保存)

即使异常发现它是“ConstrainValidatonException”,失败的请求仍然在onFailure()方法上,而不在onConstraint方法上。

我尝试了一个建议的解决方案(实体代理的深度克隆),它确实有效。但它确实只适用于持久/保存操作。对于合并操作,克隆它是无用的。已经在数据库中的旧对象被hibernate作为新对象获取,并尝试将它们保存在数据库中(并引发索引或其他约束)

更新: 所以我似乎没有说清楚。

我在数据库中的“SERVICE”表上有“NAME”列 (lower(name)) 上的以下索引。所以在“SERVICE”表中不能有2个具有相同下限(name)的记录。

假设“SERVICE”表包含名为“JOB”的记录。

在GWT中,我尝试将新的ServiceProxy持久保存到该表中,并将其命名为“jOB”。这将引发数据库中的错误,即Constraint Violation Error。我无法在向服务器发送请求之前验证这一点,因此数据库应该返回错误,我应该重新编写代理,并更正它的名称(作为有效的名称)。

堆栈如下所示:

[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)

我向客户端显示一条自定义错误消息,如“已经有一个具有给定名称的服务。请选择其他名称”,然后我想重新编写代理,更改名称,然后重新启动代理到服务器。

这是步骤

0 个答案:

没有答案