2015-05-21 15 views
14

Trong mô hình miền của ứng dụng Grails 2.5.0 của tôi, tôi có hai lớp IncomeBenefit có các thuộc tính giống nhau. Tôi muốn lưu trữ chúng trong các bảng cơ sở dữ liệu riêng biệt, nhưng di chuyển các trường chung vào một lớp cơ sở. Các mô hình tôi đã đưa ra là:thừa kế trong mô hình miền Grails gây ra các khóa ngoài trùng lặp

class Assessment { 

    Date dateCreated = new Date() 
    User user 

    static hasMany = [incomes: Income, benefits: Benefit] 
} 

class Benefit extends IncomeSource {} 

class Income extends IncomeSource {} 

abstract class IncomeSource { 

    String name 
    BigDecimal amount 
    PaymentFrequency frequency 

    static belongsTo = [assessment: Assessment] 

    static mapping = { 
     tablePerHierarchy false 
    } 
} 

Điều này làm cho các bảng sau đây để được tạo ra cho mối quan hệ giữa AssessmentBenefit

enter image description here

Các bảng được tạo ra cho các mối quan hệ giữa AssessmentBenefit là (không ngạc nhiên) giống hệt nhau.

Thay vì có một assessment_benefit tham gia bảng giữa assessmentbenefit, tôi muốn có một khóa ngoại assessment_id trong bảng benefit, do đó loại bỏ sự cần thiết của các bảng tham gia.

Làm cách nào để thay đổi mô hình miền của mình để đạt được điều này?

+0

là phiên bản Grails sử dụng gì? Tôi đã sử dụng Grails 2.4.4 và sử dụng các lớp miền được cung cấp bởi bạn, tức là Đánh giá, Lợi ích, Thu nhập và Nguồn thu nhập. Nó đã không tạo thêm bảng tham gia như bạn đã đề cập. Và nó đã thêm 'evaluation_id' vào các bảng lợi ích, thu nhập và thu nhập_source. Vì vậy, sẽ dễ dàng xác minh nếu bạn cung cấp phiên bản Grails được bạn sử dụng cho các ví dụ này. – Ramsharan

+0

Tôi đang sử dụng Grails 2.5.0 –

+0

Nó có hoạt động như được hiển thị trong câu trả lời không? – dmahapatro

Trả lời

1

Tôi làm cách nào để thay đổi mô hình miền của mình để đạt được điều này?

Move

static belongsTo = [assessment: Assessment] 

từ trừu tượng mẹ IncomeSource cho con Benefit như:

class Benefit extends IncomeSource { 
    static belongsTo = [assessment: Assessment] 
} 

Bạn cũng có thể giữ cho mối quan hệ này trong lớp cơ sở và chỉ cần sao chép belongsTo cho con là tốt.

Không có bảng tham gia nào được tạo cho AssessmentBenefit trong cả hai trường hợp.

Tương tự sẽ áp dụng cho Income, nếu hành vi tương tự là bắt buộc.

Áp dụng cho Grails 2.5.0

Các vấn đề liên quan