hibernate - Grails错误 “violates foreign key constraint”在尝试一次保存多个对象时无法添加对象

标签 hibernate grails gorm

我正在尝试保存映射为-

class Order {
   String prefix
   Long orderNumber
   Date date
   Incident incident
   //..... few more variables
}

class Incident {
    Double amountToCharge
    String description
    Boolean isCharged = false
    Order order
    //..... few more variables
}

现在,当我尝试将它们保存在服务类中时,请执行以下操作:
def save(Order orderInstance, params){
    orderInstance.withTransaction { status ->

          if (orderInstance.save()) {

            if(params.isIncident){
                def incidentStatus = saveIncident(params, orderInstance)

                if(incidentStatus.result == true){
                    println "-----------------Incident Saved"
                }else{
                    status.setRollbackOnly()
                    result["result"] = false
                    result["message"] = "Could not save. Please try again."
                    return result
                }
            }

            result["result"] = true

            return result
        } else {

            for (fieldErrors in orderInstance.errors) {
                for (error in fieldErrors.allErrors) {
                    result["message"] = messageSource.getMessage(error, locale)
                }
            }
            return result
        }
    }
}

def saveIncident(params, Order orderInstance){
    def result = [:]

    def paramsMap = [:]
    paramsMap.description = params.incident.description
    paramsMap.amountToCharge = params.incident.amountToCharge
    paramsMap.isCharged = params.incident.isCharged ? false : true
    paramsMap.order = mROrderInstance

    def incidentInstance = new Incident(paramsMap)
    println "-----Done till here. Next line throws error----"
    if (incidentInstance.save(flush:true)){
        orderInstance.incident = incidentInstance

        result["result"] = true
    }else{
        result["result"] = false

        for (fieldErrors in incidentInstance.errors) {
            for (error in fieldErrors.allErrors) {
                println messageSource.getMessage(error, locale)
                result["message"] = messageSource.getMessage(error, locale)
            }
        }
    }
    return result
}

它给了我以下错误-
ERROR: insert or update on table "order" violates foreign key     constraint "fk_a0y0jvv0o9nhkafuj7g7iknc6"
Detail: Key (incident_id)=(2) is not present in table "incident".. Stacktrace follows:
Message: ERROR: insert or update on table "order" violates foreign key constraint "fk_a0y0jvv0o9nhkafuj7g7iknc6"
Detail: Key (incident_id)=(2) is not present in table "incident".
Line | Method
->> 2102 | receiveErrorResponse in org.postgresql.core.v3.QueryExecutorImpl
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   1835 | processResults       in     ''
|    257 | execute . . . . . .  in     ''
|    500 | execute              in    org.postgresql.jdbc2.AbstractJdbc2Statement
|    388 | executeWithFlags . . in     ''
|    334 | executeUpdate        in     ''
|    124 | $tt__saveIncident .  in com.xyz.fleet.db.OrderService$$EPZ0qsAS
|     46 | doCall               in com.xyz.fleet.db.OrderService$_$tt__save_closure6$$EPZ0qsAS
|    815 | withTransaction . .  in org.grails.datastore.gorm.GormStaticApi
|    715 | withTransaction      in     ''
|     41 | $tt__save . . . . .  in com.xyz.fleet.db.MROrderService$$EPZ0qsAS
|     32 | $tt__save            in com.xyz.fleet.db.MROrderController
|    198 | doFilter . . . . . . in grails.plugin.cache.web.filter.PageFragmentCachingFilter
|     63 | doFilter             in grails.plugin.cache.web.filter.AbstractFilter
|     53 | doFilter . . . . . . in grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter
|     49 | doFilter             in grails.plugin.springsecurity.web.authentication.RequestHolderAuthenticationFilter
|     82 | doFilter . . . . . . in grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter
|     46 | doFilterInternal     in org.grails.jaxrs.web.JaxrsFilter
|   1142 | runWorker . . . . .  in java.util.concurrent.ThreadPoolExecutor
|    617 | run                  in java.util.concurrent.ThreadPoolExecutor$Worker
^    745 | run . . . . . . . .  in java.lang.Thread

当我刷新 session 时出现错误。即使我不这样做,只要它自动刷新,就会抛出相同的错误。

注意:如果我不手动刷新 session ,则保存Incident,该方法返回以保存Order。它也节省了。 Incident对象附加到Order对象,我可以使用println检查该对象
但是最后,当它自动清除 session 时,会引发相同的错误,如上所示。

所以最后有人可以告诉我这里是什么问题吗?

最佳答案

最有可能的问题是Order.incident不可为空(默认值),并且您尝试保存订单而不先保存Incident

def order = ...
def incident = ...

if(incident.save()) {
    order.incident = incident
    order.save()
}

如果Incident的实例只能属于一个Order,请尝试添加belongsTo:
class Incident {
    Double amountToCharge
    String description
    Boolean isCharged = false
    Order order
    //..... few more variables

    static belongsTo = [order: Order]
}

双向多对一关联简化了保存实例。
def order = ...
def incident = ...

order.incident = incident
order.save()

双向多对一关联使OrderIncident在一起保存。

关于hibernate - Grails错误 “violates foreign key constraint”在尝试一次保存多个对象时无法添加对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34633952/

相关文章:

grails - 如何在Grails应用程序中查看doc/pdf文件?

Java Hibernate 标准多对一

java - Hibernate:提交()后分离实体

Grails 分页 : how to use pagination to restrict the number of rows

java - Grails 错误的别名导致错误 ORA-00904

grails - 是否仅对测试数据覆盖Grails dateCreated和lastUpdated?

java - 收到的 JSON 与使用 Spring Rest 和 Hibernate 发送的 JSON 不同

java - 与 hibernate 的 Tomcat 连接问题

sql - Grails:HasMany交集查询

validation - Grails:在域类中为整数指定位数