Grails在Hibernate异常后执行更多查询的安全方法?
在我的服务中,我期望出现某种异常(Grails在Hibernate异常后执行更多查询的安全方法?,hibernate,grails,Hibernate,Grails,在我的服务中,我期望出现某种异常(DataIntegrityViolationException),这是数据库上的唯一约束阻止插入的结果。这是可以的,而且确实可以发生。我一直在使用Grails控制台来获得正确的异常类型,以便从那里继续下去。然而,我得到了这样的信息: org.hibernate.AssertionFailure: null id in <my-domain-class> entry (don't flush the Session after an except
DataIntegrityViolationException
),这是数据库上的唯一约束阻止插入的结果。这是可以的,而且确实可以发生。我一直在使用Grails控制台来获得正确的异常类型,以便从那里继续下去。然而,我得到了这样的信息:
org.hibernate.AssertionFailure: null id in
<my-domain-class> entry (don't flush the Session after an exception occurs)
org.hibernate.AssertionFailure:中的空id
条目(发生异常后不刷新会话)
现在我不知道在那之后如何继续。即使出现这个特定错误,我也需要在其他表中执行一些删除操作——基本上,我假设插入工作正常,代码从那里继续
从休眠的角度来看,在发生这种错误之后,这样做安全吗?我必须做什么才能进入一致状态,以便对不同服务的进一步调用(但仍然是相同的HTTP请求)能够正确执行HQL语句
编辑
基本工作流程:
- 服务A试图插入到数据库中
- 无论成功或失败(唯一违规),服务A都应调用服务B
- 服务B使用不同的域执行一些选择,然后执行一个重要的删除
- 控制器返回
出现此类异常后,会话可能处于无效状态。任何后续的持久性操作都应该使用新会话执行。您可以使用以下工具在Grails中打开新会话:
SomeDomainClass.withNewSession {
// code that uses the new session goes here
}
这对没有例外的情况有何影响?仅供参考:我添加了应用程序在此场景中如何工作的简短描述