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使用不同的域执行一些选择,然后执行一个重要的删除
  • 控制器返回

这里有几件事你可以试试,不是100%确定它们都能解决你的问题,但它们应该很容易尝试

  • 您可以向收到错误的字段添加唯一验证,或在尝试持久化之前要检查的自定义验证

  • 您可以在错误发生后尝试删除该对象


  • 出现此类异常后,会话可能处于无效状态。任何后续的持久性操作都应该使用新会话执行。您可以使用以下工具在Grails中打开新会话:

    SomeDomainClass.withNewSession {
      // code that uses the new session goes here
    }
    

    这对没有例外的情况有何影响?仅供参考:我添加了应用程序在此场景中如何工作的简短描述