2012-03-07 19 views
2

我已经阅读了大量的文章和文档,并且必须缺少一些东西。我可以通过关联(jointable)从缺失的数据中恢复

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

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 
} 
+0

因为您没有直接的数据库写入权限,您无法写入任何表格吗?你的应用程序没有数据库写入权限?你有更新/删除访问?因为确实,这是一个数据完整性问题,这就是解决方案。所以如果你必须解决它,最有可能会是丑陋的,你可能不得不分解ORM到达你需要的位置(如果真的有必要,我很乐意提供帮助,我以前做过这件事,但它并不是最有趣的事情:/) – 2012-03-07 15:36:34

+0

我访问的数据是只读的,因为它是从供应商(数据所有者)非现场系统同步的。对于我们来说,内部使用本地数据存储而不改变其数据。改变数据打破了他们的单向同步,然后我们必须支付美元,让他们很难将我们的商店重新设置回他们的外部数据。这就是我无法写信给我的意思。 ;)我现在正在努力设法建立一个工作命令处理程序,使我们能够从休眠状态中恢复咳嗽。它真的很难与没有RI的数据一起工作。 – rwheadon 2012-03-07 15:44:16

+0

是的,有限的数据访问和第三方集成确实有点臭:)但我不会开始试图在hibernate上进行隔离。我会写一个更正式的答案,但基本上这个简单的攻击是将id存储为整数,而不是将它们映射到GORM。尽快回复您! – 2012-03-07 16:23:02

回答

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穿越轻松能力(例如一个

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

成为形势的executeQuery类型。) 但总体而言,它不是太不好处理:) 希望有所帮助!

+0

这实际上并不可怕,我必须在其他语言/框架环境下做得更差。让我来包装一下,并运行一些测试!谢谢。 – rwheadon 2012-03-07 17:10:48

+0

嗯,我认为透视是非常相对的;)我已经基本完全用grails开始了我的职业生涯,这使得事情的方式比平常少。相比于Java/Spring/Hibernate中的一些黑客,我完全相信它看起来相当干净;)让我知道如果事情没有解决,并且需要进一步的查询! – 2012-03-07 17:17:37

+0

非常好,使用上面的概念似乎工作正常。回顾一下:1)删除了belongsTo/hasMany关系2)在jobOrderCategory模型中添加了一个组合键3)更新了getJobCategories以使用findAllByJobOrderID检索jobOrderCategories集合4)从jobOrderCategoryCollection获得了具有Criteria的类别集合。非常感谢! – rwheadon 2012-03-07 18:49:18

相关问题