2012-05-02 85 views
5

我使用grails 2.0.0。我有三個對象成員,產品和ProductType。會員有許多產品,並且是一對多的關係。 Product指向ProductType(參考表)並且是多對一的關係。我的問題是關於刪除產品。它適用於一種情況,而不適用於另一種情況。請繼續閱讀。複合鍵上的Grails一對多映射stalestaleexception

下面的映射的粗線條:

Member.groovy:

class Member { 
    Long id 
    .... 
    SortedSet products 
    static hasMany = [products:Product] 
    static mapping = { 
     table 'T_MEMBER' 
     id column:'MEMBER_ID'... 
     products cascade: "all-delete-orphan" 
    } 
} 

Product.groovy:

class Product { 
    Long id 
    ProductType productType 
    ... 
    static belongsTo = [member:Member] 
    static mapping = { 
     table 'T_PRODUCT' 
     id column:'PRODUCT_ID' 
     member column: 'MEMBER_ID' 
     productType column: 'PRODUCT_TYPE' 
     ... 
    } 
} 

ProductType.groovy:

class ProductType { 
    Long id 
    .. 
    static mapping = { 
     table 'T_PRODUCT_TYPE' 
     id column:'PRODUCT_TYPE', generator:'assigned' 
    ... 
    } 
} 

我得到了客戶服務代碼的輪廓......

if((newMember.products) && (newMember.products.size() >0)) { 
     def addList = newMember.products - existingMember.products 
     def removeList = existingMember.products- newMember.products 
     removeList.each { product -> 
      existingMember.removeFromProducts(product) 
     } 
     addList.each {product -> 
      existingMember.addToProducts(product) 
     } 
    } 

到目前爲止好。這是完美的。然而,當我做介紹複合主鍵的表T_PRODUCT如下:

static mapping = { 
     table 'T_PRODUCT' 
     //id column:'PRODUCT_ID' 
     id composite:['member', 'productType'] 
     member column: 'MEMBER_ID' 
     productType column: 'PRODUCT_TYPE' 
     ... 
    } 

我得到這個:

org.hibernate.StaleStateException:批量upda批量更新返回從更新 意想不到的行數[0];實際行數:0;預計:1 org.hibernate.StaleStateException:批量更新返回意外 行計數從更新[0];實際行數:0;預期:1在 ProductService.cleanUpGorm(ProductService.groovy:442)在 ProductService.maintainProduct(ProductService.groovy:213)在 ClientService $ _maintainMembers_closure5.doCall(ClientService.groovy:158) 在ClientService.maintainMembers(ClientService.groovy :152)在 ClientService.processMembers(ClientService.groovy:394)

任何想法,我可能會去錯了嗎?

+0

你是不是指靜態belongsTo = [member:成員] 而不是靜態belongsTo = [member:Product]? – loteq

+0

這是一個錯字。糾正它。謝謝。 – arrehman

+0

是否可以提供測試用例? –

回答

1

我強烈建議您閱讀Grails doc, 5.5.2.5 Composite Primary Keys。他們指出以下幾點,你不尊重:與複合主鍵映射

  1. 域類必須實現Serializable接口和覆蓋equals()hashCode()方法,在計算組合鍵使用屬性。
  2. 您還需要了解使用組合主鍵是關聯,尤其是映射的列名稱。
  3. 也許,在複合鍵中使用多對一映射類型並不好。

也許它可以幫助你獲得正確的方向。

6

您的產品域類必須實現Serializable並覆蓋方法hashCode()equals(),這個事情必須在您使用組合鍵的情況下完成。

您的產品領域類必須是這樣的

class Product implements Serializable { 
     Long id 
     ProductType productType 
     ... 

     static mapping = { 
      table 'T_PRODUCT' 
      id composite:['member', 'productType'] 
      member column: 'MEMBER_ID' 
      productType column: 'PRODUCT_TYPE' 
     } 

     boolean equals(other) { 
      if (!(other instanceof Product)) { 
       return false 
      } 
      other.member== member && other.productType== productType 
     } 

     int hashCode() { 
      def builder = new HashCodeBuilder() 
      builder.append member 
      builder.append productType 
      builder.toHashCode() 
     } 

    } 

我想這一切的方式將是確定。

如有問題請寫。

+0

此域名確實實施了Seriealizable,並未將其粘貼爲簡單起見。 equals和hashCode方法也是適用的。即使所有這些,它都不起作用。只要我切換回使用產品類的非複合主鍵,它就可以工作...... – arrehman