2012-03-07 28 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

相關問題