我可以参考缺失数据从关联(joinTable)中恢复

时间:2012-03-07 15:09:52

标签: grails many-to-many jointable

我已阅读了很多帖子和文档,但必须遗漏一些内容。

在我的应用程序(下面的模型)中,我遇到的数据问题似乎超出了我的控制范围,我在连接表JOBORDERCATEGORIES中有一个categoryId,在CATEGORY表中没有对应的行。我通过JobOrder中的getJobCategories()访问类别数据。当我的Category表缺少引用的行时,这会产生以下错误:

2012-03-07 08:02:10,223 [quartzScheduler_Worker-1] ERROR listeners.SessionBinderJobListener  - Cannot flush Hibernate Sesssion, error will be ignored
org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.matrixres.domain.Category#416191]

我的代码暂停了。

我尝试过使用ignoreNotFound,但它并没有帮助我克服上述错误。

如果我错过了关于此问题的解决方案的帖子,请链接到我,否则欢迎如何前进。也许有一条更直接的路线我必须努力实现我的目标才能获得一个好的类别列表,但我对框架不太熟悉,不知道下一步是什么。作为一个注释,我不能写任何这些表。

谢谢,丰富

我的模型的简化版本:

作业订单对象:

class JobOrder {
   def getJobCategories() {
        def cats = []
        try {
            def jocategories = this.categories
            if(!jocategories.isEmpty() && jocategories!=null){
                println "we got categories for ${this.id}"

                jocategories.each {  cat ->
                    if(cat?.parentCategoryID == 0){
                        if(cat.occupation != null){
                          cats <<  cat.occupation
                        } else {
                          cats <<  cat.name
                        }
                    }
                }
            }
        } catch(e) {
            cats << "Other Area(s)"
        }
        cats
    }

  static mapping = {
    table 'dbo.JOBORDER'
    version false
    id generator: 'identity', column: 'JOBORDERID'

    /*
     * several other mapped columns deleted here
    */

    categories joinTable:[name:'jobOrderCategories', column: 'categoryId', key:'jobOrderID']
  }

  /*
    * several properties deleted here
    */
  static hasMany = [categories: Category] //several other hasMany associations exist

}

类别对象:

class Category {

    static mapping = {
        table 'CATEGORY'
        version false
        id generator: 'identity', column: 'categoryID'
        occupation column: 'OCCUPATION'
        name column: 'NAME'
        parentCategoryID column: 'PARENTCATEGORYID'       
        /*
         * several other mapped columns deleted here
         */

        jobOrders joinTable:[name:'jobOrderCategories', column: 'jobOrderID', key:'categoryId']
    }

    String name
    String occupation
    int parentCategoryID
    /*
     * several properties deleted here
     */

    static belongsTo = [JobOrder]
    static hasMany = [jobOrders:JobOrder]
}

加入表格

class JobOrderCategories {
  static mapping = {
    table 'JOBORDERCATEGORIES'
    version false
    isDeleted column: 'ISDELETED'
    jobOrderID column: 'JOBORDERID'
    categoryId column: 'CATEGORYID'
  }

  Boolean isDeleted
  Integer jobOrderID
  Integer categoryId
}

1 个答案:

答案 0 :(得分:2)

这些情况并不是最有趣的,但我之前必须处理这种自己动手的ORM问题;)基本上你要做的就是存储对象属性不是作为对象引用输入,而是作为整数,虽然你会失去一些动态查找器的东西GORM如此漂亮,你将有一个相当直接的方法访问数据,不涉及纠结自己Hibernate的内脏。

基本上,这将涉及放弃JobOrder和Category上的hasMany和belongsTo属性。相反,你会想做像

这样的事情
def myJobOrder = JobOrder.get(yourId);
def myCategoryIds = JobOrderCategories.findAllByJobOrderID(myJobOrder.id)
def myCategories = Categories.withCriteria {
    in('id', myCategoryIds)
}

您可以在类的辅助方法中放置这些遍历的变体,例如,您的getJobCategories方法可能会变为

class JobOrder {
//...
    def getJobCategories() {
        def myCategoryIds = JobOrderCategories.findAllByJobOrderID(this.id)
        def myCategories = Categories.withCriteria {
            in('id', myCategoryIds)
        }
    }
}

等等。这绝对不是世界上最讨人喜欢的事情,你失去了使用GORM轻松穿越事物的能力(ex a

jobOrder.withCriteria {
   categories {
     eq('name', blah)
   }
}

成为executeQuery类型的情况。) 但总的来说,处理起来并不算太糟糕:) 希望有所帮助!