2012-05-02 9 views
5

Tôi sử dụng grails 2.0.0. Tôi có ba đối tượng Thành viên, Sản phẩm và Loại sản phẩm. Thành viên có nhiều Sản phẩm và là mối quan hệ một-nhiều. Các điểm sản phẩm cho ProductType (bảng tham chiếu) và là một mối quan hệ nhiều-một. Câu hỏi của tôi là xóa Sản phẩm. Nó hoạt động trong một kịch bản chứ không phải trong một kịch bản khác. Đọc tiếp.Grails một trong rất nhiều ánh xạ đánh giá trên phím tổng hợp

phác thảo thô của ánh xạ dưới đây:

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' 
    ... 
    } 
} 

Tôi đã nhận mã phục vụ khách hàng một phác thảo trong số đó là ...

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) 
     } 
    } 

Cho đến nay rất tốt. Điều này hoạt động hoàn hảo. Tuy nhiên khi tôi giới thiệu khóa chính tổng hợp cho bảng T_PRODUCT bằng cách làm như sau:

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

tôi có được điều này:

org.hibernate.StaleStateException: cập nhật hàng loạt upda hàng loạt trở đếm hàng bất ngờ từ cập nhật [0]; số hàng thực tế: 0; dự kiến: 1 org.hibernate.StaleStateException: Cập nhật hàng loạt được trả lại bất ngờ số lượng hàng từ bản cập nhật [0]; số hàng thực tế: 0; mong đợi: 1 tại ProductService.cleanUpGorm (ProductService.groovy: 442) tại ProductService.maintainProduct (ProductService.groovy: 213) tại ClientService $ _maintainMembers_closure5.doCall (ClientService.groovy: 158) tại ClientService.maintainMembers (ClientService.groovy : 152) tại ClientService.processMembers (ClientService.groovy: 394)

Bất kỳ ý tưởng nào tôi có thể gặp sự cố?

+0

không có nghĩa là static attributeTo = [member: Member] thay vì static dependsTo = [member: Product]? – loteq

+0

Đó là một lỗi đánh máy. sửa chữa nó. Cảm ơn. – arrehman

+0

Có thể cung cấp trường hợp kiểm tra không? –

Trả lời

1

Tôi khuyên bạn nên đọc số Grails doc, 5.5.2.5 Composite Primary Keys. Họ chỉ ra những điều sau đây, mà bạn không tôn trọng: lớp

  1. miền ánh xạ với các phím composite tiểu học phải thực hiện các giao diện Serializable và ghi đè lên các phương pháp equals()hashCode(), sử dụng các thuộc tính trong chính tổng hợp cho các tính toán.
  2. Bạn cũng cần phải biết về việc sử dụng các khóa chính kết hợp là các liên kết, đặc biệt là các tên cột được ánh xạ.
  3. Có thể, không tốt bằng cách sử dụng loại được ánh xạ nhiều người trong một khóa tổng hợp.

Có thể nó giúp bạn đi đúng hướng.

6

Lớp miền sản phẩm của bạn phải triển khai Serializable và phương pháp ghi đè hashCode()equals(), điều này phải được thực hiện trong các trường hợp bạn sử dụng khóa tổng hợp.

sản phẩm lớp miền của bạn phải như thế này

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() 
     } 

    } 

Tôi nghĩ rằng cách này mọi thứ sẽ ổn.

Trong trường hợp có sự cố viết.

+0

Miền thực hiện Seriealizable, không dán nó để đơn giản. Các phương thức equals và hashCode cũng được đặt ra. Ngay cả với tất cả điều này, nó không hoạt động. Ngay sau khi tôi chuyển về sử dụng khóa chính không phải tổng hợp cho lớp Sản phẩm, nó hoạt động ... – arrehman