在我的服务中,我期望某种异常(DataIntegrityViolationException),这是数据库上唯一的阻止插入的结果。可以,并且可以实际发生。我一直在使用Grails控制台来获取正确的异常类型,以便从那里继续。但是,我收到此消息:

org.hibernate.AssertionFailure: null id in
<my-domain-class> entry (don't flush the Session after an exception occurs)

现在,我不确定之后如何继续。即使发生此特定错误,我也需要在其他表中执行一些删除操作-基本上,我认为插入工作正常,并且代码仅从那里继续。

从Hibernate的 Angular 来看,发生这种错误之后是否安全?我必须怎么做才能进入一致状态,以便对其他服务的进一步调用(但仍是相同的HTTP请求)可以正确执行HQL语句?

编辑

基本工作流程:
  • 服务A尝试将
  • 插入数据库
  • 不管成功还是失败(唯一违反),服务A都应调用服务B
  • 服务B使用不同的域执行一些选择,然后删除一个重要的
  • Controller 返回
  • 最佳答案

    发生此类异常后, session 可能处于无效状态。任何后续的持久性操作都应与新 session 一起执行。您可以使用以下命令在Grails中打开一个新 session :

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

    09-10 08:07
    查看更多